一些有关清空时初始化的疑问
查看原帖
一些有关清空时初始化的疑问
776873
da17_楼主2024/4/15 14:24

下面第一份代码可以通过,而第二份只有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++]);
}
2024/4/15 14:24
加载中...