人机分块TLE on 2#求条
查看原帖
人机分块TLE on 2#求条
500031
FJ_OIer楼主2025/7/24 13:46

感觉做法假了

#include <bits/stdc++.h>
#define N 200001
using namespace std;
int n,q,l,r,x,y;
int len,cnt,tot;
int a[N],block[N];
list<int>::iterator t[N];
list<int> link[1001][101];
void build(){
	for (int i=1;i<=n/len;i++){
		++cnt;
		for (int j=1;j<=len;j++){
			int pos=(i-1)*len+j;
			block[pos]=i;
			link[i][a[pos]].push_back(pos);
		}
	}
	++cnt;
	for (int i=n/len*len+1;i<=n;i++){
		block[i]=cnt;
		link[cnt][a[i]].push_back(i);
	}
}
void change(){
	int L=block[l],R=block[r];
	for (int i=L+1;i<R;i++){
		link[i][y].splice(link[i][y].begin(),link[i][x]);
	}
	tot=0;
	for (list<int>::iterator it=link[L][x].begin();it!=link[L][x].end();it++){
		int tmp=(*it);
		if (tmp>=l&&tmp<=r){
			link[L][y].push_back(tmp);
			t[++tot]=it;
		}
	}
	while (tot)link[L][x].erase(t[tot--]);
	for (list<int>::iterator it=link[R][x].begin();it!=link[R][x].end();it++){
		int tmp=(*it);
		if (tmp>=l&&tmp<=r){
			link[R][y].push_back(tmp);
			t[++tot]=it;
		}
	}
	while (tot)link[R][x].erase(t[tot--]);
}
int main(){
	freopen("data.txt","r",stdin);
	cin>>n;
	len=sqrt(n);
	int mx=0;
	for (int i=1;i<=n;i++){
		cin>>a[i];
		mx=max(mx,a[i]);
	}
	build();
	cin>>q;
	while (q--){
		cin>>l>>r>>x>>y;
		mx=max(mx,y);
		change();
	}
	for (int i=1;i<=cnt;i++)
		for (int j=1;j<=mx;j++)
			for (auto k:link[i][j])
				a[k]=j;
	for (int i=1;i<=n;i++){
		printf("%d ",a[i]);
	}
	return 0;
}
2025/7/24 13:46
加载中...