分块 TLE#114求助
查看原帖
分块 TLE#114求助
1236806
wjr_jok楼主2024/7/24 21:19
#include<bits/stdc++.h>
using namespace std;
int read() {
    char ch=getchar();
    int r=0,w=1;
    while(ch<'0'||ch>'9') w=ch=='-'?-1:w,ch=getchar();
    while(ch>='0'&&ch<='9') r=r*10+ch-'0',ch=getchar();
    return r*w;
}
void write(long long n){
    if(n<0) putchar('-'),n*=-1;
    if(n>9) write(n/10);
    putchar(n % 10 + '0');
}
const int N=200001,M=451;
int n,q,cnt,l,r,s,w;
int xl[N],x[M],y[M],fk[N],flag[M][101],nice[M];
int A[M][101],C[M][101][M],AC[M][101];
signed main(){
	n=read();
	for(int i=1;i<=n;i++){
		xl[i]=read();
	}
	for(int i=1;i<=(int)sqrt(n);i++){
		cnt++;
		x[cnt]=y[cnt-1]+1;
		y[cnt]=x[cnt]+(int)sqrt(n)-1;
		for(int j=x[cnt];j<=y[cnt];j++){
			fk[j]=cnt;
		}
	}
	if(y[cnt]<n){
		cnt++;
		x[cnt]=y[cnt-1]+1;
		y[cnt]=n;
		for(int i=x[cnt];i<=y[cnt];i++){
			fk[i]=cnt;
		}
	}
	for(int i=1;i<=cnt;i++){
		nice[i]=1;
	}
	q=read();
	for(int i=1;i<=q;i++){
		l=read(),r=read(),s=read(),w=read();
		for(int j=l;j<=min(y[fk[l]],r);j++){
			if(A[fk[l]][xl[j]]==s||(!A[fk[l]][xl[j]]&&xl[j]==s)){
				xl[j]=w;
			}
			else if(A[fk[l]][xl[j]]){
				xl[j]=A[fk[l]][xl[j]];
			}
		}
		for(int j=x[fk[l]];j<l;j++){
			if(A[fk[l]][xl[j]]){
				xl[j]=A[fk[l]][xl[j]];
			}
		}
		if(r<y[fk[l]]){
			for(int j=r+1;j<=y[fk[l]];j++){
				if(A[fk[l]][xl[j]]){
					xl[j]=A[fk[l]][xl[j]];
				}
			}
		}
		for(int j=1;j<=AC[fk[l]][0];j++){
			C[fk[l]][AC[fk[l]][j]][0]=0;
			A[fk[l]][AC[fk[l]][j]]=0;
		}
		AC[fk[l]][0]=0;
		nice[fk[l]]++;
		if(fk[l]!=fk[r]){
			for(int j=x[fk[r]];j<=r;j++){
				if(A[fk[r]][xl[j]]==s||(!A[fk[r]][xl[j]]&&xl[j]==s)){
					xl[j]=w;
				}
				else if(A[fk[r]][xl[j]]){
					xl[j]=A[fk[r]][xl[j]];
				}
			}
			for(int j=r+1;j<=y[fk[r]];j++){
				if(A[fk[r]][xl[j]]){
					xl[j]=A[fk[r]][xl[j]];
				}
			}
			for(int j=1;j<=AC[fk[r]][0];j++){
				C[fk[r]][AC[fk[r]][j]][0]=0;
				A[fk[r]][AC[fk[r]][j]]=0;
			}
			AC[fk[r]][0]=0;
			nice[fk[r]]++;
		}
		for(int j=fk[l]+1;j<fk[r];j++){
			if(flag[j][s]!=nice[j]){
				AC[j][++AC[j][0]]=s;
				flag[j][s]=nice[j];
			}
			if(flag[j][w]!=nice[j]){
				AC[j][++AC[j][0]]=w;
				flag[j][w]=nice[j];
			}
			for(int k=1;k<=C[j][s][0];k++){
				A[j][C[j][s][k]]=w;
				C[j][w][++C[j][w][0]]=C[j][s][k];
			}
			if(!A[j][s]){
				A[j][s]=w;
				C[j][w][++C[j][w][0]]=s;
			}
			C[j][s][0]=0;
		}
	}
	for(int i=1;i<=n;i++){
		if(A[fk[i]][xl[i]]){
			write(A[fk[i]][xl[i]]);
		}
		else{
			write(xl[i]);
		}
		printf(" ");
	}
	return 0;
}
2024/7/24 21:19
加载中...