社区讨论
50pts求条
P3201[HNOI2009] 梦幻布丁参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @miyl5wsm
- 此快照首次捕获于
- 2025/12/09 20:58 2 个月前
- 此快照最后确认于
- 2025/12/12 19:05 2 个月前
想不到有什么问题了,和其他人那些rt没清零的也不一样
CPP#include<iostream>
using namespace std;
long long n,m;
long long la[1000006];
long long l[2000006],r[2000006],sum[2000006],lx[2000006],rx[2000006];
long long t,rt[2000006];
void pu(long long p,long long a,long long b){
lx[p]=lx[l[p]],rx[p]=rx[r[p]];
sum[p]=sum[l[p]]+sum[r[p]];
if(rx[l[p]]&&lx[r[p]]){
sum[p]--;
}
}
void js(long long a,long long b,long long x){
t++;
long long p=t;
if(a==b){
sum[p]=lx[p]=rx[p]=1;
return ;
}
long long g=(a+b)>>1;
if(g>=x){
l[p]=t+1;
js(a,g,x);
}else{
r[p]=t+1;
js(g+1,b,x);
}
pu(p,a,b);
return ;
}
long long hb(long long x,long long y,long long a,long long b){
if(!x||!y)return x+y;
if(a==b){
sum[x]+=sum[y];
lx[x]+=lx[y];
rx[x]+=rx[y];
return x;
}
long long g=(a+b)>>1;
l[x]=hb(l[x],l[y],a,g);
r[x]=hb(r[x],r[y],g+1,b);
pu(x,a,b);
return x;
}
long long ans;
int main(){
freopen("D_7.in","r",stdin);
freopen("D.out","w",stdout);
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++){
long long pyj;
scanf("%lld",&pyj);
rt[i]=t+1;
js(1,n,i);
ans++;
if(la[pyj]){
ans-=sum[rt[i]]+sum[rt[la[pyj]]];
rt[la[pyj]]=hb(rt[la[pyj]],rt[i],1,n);
ans+=sum[rt[la[pyj]]];
}
else{
la[pyj]=i;
}
}
while(m--){
long long k;
scanf("%lld",&k);
if(k==1){
long long x,y;
scanf("%lld%lld",&x,&y);
long long f1=la[x],f2=la[y];
if(rt[f2]==0){
rt[f2]=rt[f1];
rt[f1]=0;
continue;
}
if(f1!=f2){
ans-=sum[rt[f1]]+sum[rt[f2]];
rt[f2]=hb(rt[f2],rt[f1],1,n);
ans+=sum[rt[f2]];
rt[f1]=0;
}
}else{
printf("%lld\n",ans);
}
}
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...