下面第一份代码可以通过,而第二份只有70pts,改动点在于每次solve时的清空上次答案,问一下区别在哪
part1:
void add(int x){ cnt[x]++,s[x+cnt[x]]=1; }
void del(int x){ s[x+cnt[x]]=0,cnt[x]--; }
void solve(int num){
s.reset(); memset(cnt,0,sizeof(cnt));
for(int i=1;i<=num;i++) Ans[i]=0,ans[i].set();
int tot=0;
for(int i=1;i<=num;i++)
for(int j=0;j<3;j++)
++tot,scanf("%d%d",&t[tot].l,&t[tot].r),t[tot].id=i,Ans[i]+=t[tot].r-t[tot].l+1;
sort(t+1,t+1+tot,cmp);
int l=1,r=0;
for(int j=1;j<=tot;j++){
int u=t[j].l,v=t[j].r,p=t[j].id;
while(l>u) add(a[--l]);
while(r<v) add(a[++r]);
while(l<u) del(a[l++]);
while(r>v) del(a[r--]);
ans[p]&=s;
}
for(int j=1;j<=num;j++)
printf("%d\n",Ans[j]-ans[j].count()*3);
}
part2:
void add(int x){ cnt[x]++,s[x+cnt[x]]=1; }
void del(int x){ s[x+cnt[x]]=0,cnt[x]--; }
void solve(int num){
int tot=0;
for(int i=1;i<=num;i++)
for(int j=0;j<3;j++)
++tot,scanf("%d%d",&t[tot].l,&t[tot].r),t[tot].id=i;
sort(t+1,t+1+tot,cmp);
int l=1,r=0;
for(int j=1;j<=tot;j++){
int u=t[j].l,v=t[j].r,p=t[j].id;
while(l>u) add(a[--l]);
while(r<v) add(a[++r]);
while(l<u) del(a[l++]);
while(r>v) del(a[r--]);
if(ans[p].any()) ans[p]&=s;
else ans[p]=s; Ans[p]+=r-l+1;
}
for(int j=1;j<=num;j++)
printf("%d\n",Ans[j]-ans[j].count()*3),ans[j].reset(),Ans[j]=0;
for(;l<=r;) del(a[l++]);
}