求卡常(玄关)
查看原帖
求卡常(玄关)
708800
banned_fengyihao楼主2025/7/31 16:29

做了一天了,把几乎除了满分以外的分都得过了,这是91pts中最快的:

#include<bits/stdc++.h>
using namespace std;
//#define int long long
int n,m,cblo,op,x,y,z,w,a[100010],tmp1[320],tmp[100010],s[320][100010],s1[320][320],sum[320][100010],st[320],ed[320],bel[100010],bel1[100010],sum1[320][320],fa[100010],fl[320][100010];const int blo=550; 
inline int read(){
	register int x=0;
	char c=getchar();
	while(c<'0'||c>'9'){
		c=getchar();
	}
	while('0'<=c&&c<='9'){
		x=(x<<1)+(x<<3)+c-'0';
		c=getchar();
	}
	return x;
}
inline void write(int x) {
	if(x>9){
		write(x/10);
	}
	putchar(x%10+'0');
	return;
}
inline int find(register int x){
	if(x==fa[x])return x;
	fa[x]=find(fa[x]);
	return fa[x];
}
inline void chg(register int x,register int y,register int z){
	--sum[x][y];++sum[x][z];
	--sum1[x][bel1[y]];++sum1[x][bel1[z]];
}
inline void build(register int id,register int x){
	for(register int i=id;i<=cblo;++i)s[i][x]=s[i-1][x]+sum[i][x];
	for(register int i=id;i<=cblo;++i)s1[i][bel1[x]]=s1[i-1][bel1[x]]+sum1[i][bel1[x]];
}
inline void modify(register int l,register int r,register int x,register int y){
	for(register int i=st[bel[l]];i<=ed[bel[l]];++i)a[i]=a[find(i)]; 
	fl[bel[l]][x]=fl[bel[l]][y]=0;
	for(register int i=l;i<=r;++i){
		if(a[i]==x){
			a[i]=y;chg(bel[l],x,y);
		}
	}
	for(register int i=st[bel[l]];i<=ed[bel[l]];++i){
		if(a[i]!=x&&a[i]!=y)continue;
		if(fl[bel[l]][a[i]])fa[i]=fl[bel[l]][a[i]];
		else{
			fl[bel[l]][a[i]]=i;fa[i]=i;
		}
	}
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	n=read();m=read();cblo=(n+blo-1)/blo;
	for(register int i=1;i<=n;++i)a[i]=read();
	for(register int i=1;i<=cblo;++i){
		st[i]=(i-1)*blo+1;ed[i]=i*blo;
	}
	for(register int i=1;i<=n;++i){
		bel[i]=(i+blo-1)/blo;
	}
	for(register int i=1;i<=100000;++i){
		bel1[i]=(i+blo-1)/blo;
	}
	for(register int i=1;i<=n;++i)fa[i]=i;
	ed[cblo]=n;
	for(register int i=1;i<=n;++i){
		sum[bel[i]][a[i]]++;sum1[bel[i]][bel1[a[i]]]++;
	}
	for(register int i=1;i<=cblo;++i){
		for(register int j=st[i];j<=ed[i];++j){
			if(fl[i][a[j]])fa[j]=fl[i][a[j]];
			else{
				fl[i][a[j]]=j;fa[j]=j;
			}
		}
	}
	for(register int i=1;i<=100000;++i)build(1,i);
	while(m--){
		op=read();x=read();y=read();z=read();
		if(op==1){
			w=read();
			if(z==w)continue;
			if(bel[x]==bel[y]){
				modify(x,y,z,w);build(bel[x],z);build(bel[x],w);continue;
			}
			modify(x,st[bel[x]+1]-1,z,w);
			modify(ed[bel[y]-1]+1,y,z,w);
			for(register int i=bel[x]+1;i<bel[y];++i){
				if(!fl[i][z])continue;
				if(!fl[i][w]){
					a[fl[i][z]]=w;fl[i][w]=fl[i][z];
				}
				else fa[fl[i][z]]=fl[i][w];
				sum1[i][bel1[w]]+=sum[i][z];
				sum1[i][bel1[z]]-=sum[i][z];
				sum[i][w]+=sum[i][z];sum[i][z]=fl[i][z]=0;
			}
			build(bel[x],z);build(bel[x],w);
		}
		else{
			if(bel[x]==bel[y]){
				for(register int i=x;i<=y;++i){
					++tmp1[bel1[a[find(i)]]];
					++tmp[a[find(i)]];
				}
			}
			else{
				for(register int i=x;i<=st[bel[x]+1]-1;++i){
					++tmp1[bel1[a[find(i)]]];
					++tmp[a[find(i)]];
				}
				for(register int i=ed[bel[y]-1]+1;i<=y;++i){
					++tmp1[bel1[a[find(i)]]];
					++tmp[a[find(i)]];
				}
				for(register int i=1;i<=182;++i)tmp1[i]+=s1[bel[y]-1][i]-s1[bel[x]][i];
			}
			for(register int i=1;i<=182;++i){
				if(z<=tmp1[i]){
					for(register int j=(i-1)*blo+1;j<=i*blo;++j){
						if(bel[x]!=bel[y]){
							if(z<=tmp[j]+s[bel[y]-1][j]-s[bel[x]][j]){
								cout<<j<<"\n";break;
							}
							else z-=tmp[j]+s[bel[y]-1][j]-s[bel[x]][j];
						}
						else{
							if(z<=tmp[j]){
								cout<<j<<"\n";break;
							}
							else z-=tmp[j];
						}
					}
					break;
				}
				else z-=tmp1[i];
			}
			if(bel[x]==bel[y]){
				for(register int i=x;i<=y;++i){
					--tmp1[bel1[a[find(i)]]];
					--tmp[a[find(i)]];
				}
			}
			else{
				for(register int i=x;i<=st[bel[x]+1]-1;++i){
					--tmp1[bel1[a[find(i)]]];
					--tmp[a[find(i)]];
				}
				for(register int i=ed[bel[y]-1]+1;i<=y;++i){
					--tmp1[bel1[a[find(i)]]];
					--tmp[a[find(i)]];
				}
				for(register int i=1;i<=182;++i)tmp1[i]-=s1[bel[y]-1][i]-s1[bel[x]][i];
			}
		}
	}
	return 0;
}
/*
17 3
4 4 1 5 4 5 4 3 1 1 2 2 1 3 2 5 2
1 5 11 4 3
1 5 11 1 4
2 8 11 3

4
*/
2025/7/31 16:29
加载中...