50pts求助
查看原帖
50pts求助
858671
GeorgeAAAADHD楼主2023/12/2 16:21
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5,A=2e6+5;
int n,m,a,rt[A<<4],ls[A<<4],rs[A<<4],s[A<<4],cnt=0,op,x,y,ans=0;
bool fl[A<<4],fr[A<<4];
void pushup(int rt){
	bool l=fr[ls[rt]],r=fl[rs[rt]];
	if(l&&r)s[rt]=s[ls[rt]]+s[rs[rt]]-1;
	else s[rt]=s[ls[rt]]+s[rs[rt]];
	fl[rt]=fl[ls[rt]],fr[rt]=fr[rs[rt]];
}
int add(int rt,int l,int r,int x){
	if(!rt)rt=++cnt;
	if(l==r){
		s[rt]=1;
		fl[rt]=fr[rt]=1;
		return rt;
	}
	int mid=(l+r)>>1;
	if(x<=mid)ls[rt]=add(ls[rt],l,mid,x);
	else rs[rt]=add(rs[rt],mid+1,r,x);
	pushup(rt);
	return rt;
}
int merge(int rtx,int rty,int l,int r){
	if(!rtx||!rty)return rtx+rty;
	if(l==r){
		s[rtx]=s[rty],s[rty]=0,fl[rtx]=fl[rty],fl[rty]=0,fr[rtx]=fr[rty],fr[rty]=0;
		return rtx;
	}
	int mid=(l+r)>>1;
	ls[rtx]=merge(ls[rtx],ls[rty],l,mid);
	rs[rtx]=merge(rs[rtx],rs[rty],mid+1,r);
	pushup(rtx);
	s[rty]=fl[rty]=fr[rty]=0;
	return rtx;
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a;
		ans-=s[rt[a]];
		rt[a]=add(rt[a],1,n,i);
		ans+=s[rt[a]];
	}
	while(m--){
		cin>>op;
		if(op==1){
			cin>>x>>y;
			if(x==y||!rt[x])continue;
			ans-=s[rt[x]]+s[rt[y]];
			rt[y]=merge(rt[y],rt[x],1,n);
			s[rt[x]]=0;
			ans+=s[rt[y]];
		}
		else{
			cout<<ans<<'\n';
		}
	}
	return 0;
}

测试点7-11没过,WA了。

2023/12/2 16:21
加载中...