社区讨论

瓦9个点10pt求调

P4119[Ynoi2018] 未来日记参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mhj1rd5i
此快照首次捕获于
2025/11/03 19:18
4 个月前
此快照最后确认于
2025/11/03 19:18
4 个月前
查看原帖
前9个点全wa,hack数据ac。
玄关,求调
CPP
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
using ull=unsigned long long;
using ld=long double;
using pii=pair<int,int>;
#define fi first
#define se second
template<typename Tp> Tp read() {
	Tp x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
template<typename Tp> void write(Tp x) {
	if(x<0) {putchar('-');x=-x;}
	static int sta[45];int top=0;
	do {sta[top++]=x%10;x/=10;} while(x);
	while(top) putchar(sta[--top]+'0');
}
constexpr int N=1e5+5,B=170,SZ=600,S=320,VSZ=320,MAXV=1e5;
int n,m,a[N],k,le[B],ri[B],cnt[B][N],sumc[B][N],vbel[N],sums[B][S],c[N],s[S];
int fa[N],rt[B][N];
int find(int x) {
	return x==fa[x]?x:x=find(fa[x]);
}
int sta[N],top;
void update(int p,int l,int r,int x,int y) {
	int tmp=0;top=0;
	rt[p][x]=rt[p][y]=0;
	for(int i=le[p];i<=ri[p];i++) {
		a[i]=a[find(i)];
		if(a[i]==x||a[i]==y) sta[++top]=i;
	}
	for(int i=l;i<=r;i++)
		if(a[i]==x) a[i]=y,tmp++;
	for(int i=1;i<=top;i++) fa[sta[i]]=sta[i];
	for(int i=1;i<=top;i++) {
		if(!rt[p][a[sta[i]]]) rt[p][a[sta[i]]]=sta[i];
		else fa[sta[i]]=rt[p][a[sta[i]]];
	}
	cnt[p][x]-=tmp,cnt[p][y]+=tmp;
	for(int i=p;i<=k;i++) {
		sumc[i][x]-=tmp,sumc[i][y]+=tmp;
		if(vbel[x]!=vbel[y]) sums[i][vbel[x]]-=tmp,sums[i][vbel[y]]+=tmp;
	}
}
int main() {
	n=read<int>(),m=read<int>();
	k=(n-1)/SZ+1;
	for(int i=1;i<=n;i++) a[i]=read<int>(),fa[i]=i;
	for(int i=1;i<=MAXV;i++) vbel[i]=(i-1)/VSZ+1;
	for(int i=1;i<=k;i++) {
		le[i]=(i-1)*SZ+1,ri[i]=min(i*SZ,n);
		for(int j=le[i];j<=ri[i];j++) {
			if(!rt[i][a[j]]) rt[i][a[j]]=j;
			else fa[j]=rt[i][a[j]];
			cnt[i][a[j]]++;
		}
		for(int j=1;j<=MAXV;j++) sumc[i][j]=sumc[i-1][j]+cnt[i][j];
		for(int j=1;j<S;j++) sums[i][j]=sums[i-1][j];
		for(int j=le[i];j<=ri[i];j++) sums[i][vbel[a[j]]]++;
	}
	while(m--) {
		int op=read<int>();
		if(op==1) {
			int l=read<int>(),r=read<int>(),x=read<int>(),y=read<int>();
			if(x==y) continue;
			int lb=(l-1)/SZ+1,rb=(r-1)/SZ+1;
			if(lb==rb) update(lb,l,r,x,y);
			else {
				update(lb,l,ri[lb],x,y);
				update(rb,le[rb],r,x,y);
				int tmp=0;
				for(int i=lb+1;i<rb;i++) {
					if(rt[i][x]) {
						if(!rt[i][y]) rt[i][y]=rt[i][x];
						else fa[rt[i][x]]=rt[i][y];
						rt[i][x]=0,tmp+=cnt[i][x];
						cnt[i][y]+=cnt[i][x],cnt[i][x]=0;
					}
					sumc[i][x]-=tmp,sumc[i][y]+=tmp;
					if(vbel[x]!=vbel[y]) sums[i][vbel[x]]-=tmp,sums[i][vbel[y]]+=tmp;
				}
				for(int i=rb;i<=k;i++) {
					sumc[i][x]-=tmp,sumc[i][y]+=tmp;
					if(vbel[x]!=vbel[y]) sums[i][vbel[x]]-=tmp,sums[i][vbel[y]]+=tmp;
				}
			}
		}
		else {
			int l=read<int>(),r=read<int>(),x=read<int>();
			int lb=(l-1)/SZ+1,rb=(r-1)/SZ+1;
			if(lb==rb) {
				for(int i=l;i<=r;i++)
					a[i]=a[find(i)],c[a[i]]++,s[vbel[a[i]]]++;
				int vl=-1,vr=-1,tmp=0;
				for(int i=1;i<S;i++) {
					tmp+=s[i];
					if(tmp>=x) {
						tmp-=s[i];
						vl=(i-1)*VSZ+1,vr=i*VSZ;
						break;
					}
				}
				for(int i=vl;i<=vr;i++) {
					tmp+=c[i];
					if(tmp>=x) {
						write(i);putchar('\n');
						break;
					}
				}
				for(int i=l;i<=r;i++)
					c[a[i]]--,s[vbel[a[i]]]--;
			}
			else {
				for(int i=l;i<=ri[lb];i++)
					a[i]=a[find(i)],c[a[i]]++,s[vbel[a[i]]]++;
				for(int i=le[rb];i<=r;i++)
					a[i]=a[find(i)],c[a[i]]++,s[vbel[a[i]]]++;
				int vl=-1,vr=-1,tmp=0;
				for(int i=1;i<S;i++) {
					tmp+=s[i]+sums[rb-1][i]-sums[lb][i];
					if(tmp>=x) {
						tmp-=s[i]+sums[rb-1][i]-sums[lb][i];
						vl=(i-1)*VSZ+1,vr=i*VSZ;
						break;
					}
				}
				for(int i=vl;i<=vr;i++) {
					tmp+=c[i]+sumc[rb-1][i]-sumc[lb][i];
					if(tmp>=x) {
						write(i);putchar('\n');
						break;
					}
				}
				for(int i=l;i<=ri[lb];i++)
					c[a[i]]--,s[vbel[a[i]]]--;
				for(int i=le[rb];i<=r;i++)
					c[a[i]]--,s[vbel[a[i]]]--;
			}
		}
	}
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...