第二分块莫名WA on #14球调
查看原帖
第二分块莫名WA on #14球调
26551
LFCode楼主2021/5/17 17:59

CF 上的弱化版本用这份代码过掉了,甚至还拿了个目前 Rank1

在这里莫名其妙 WA 掉了最后一个点,而且挂在了 line 1 colomn 1,答案是 0 这份代码输出 9……

挂掉的提交记录

孩子实在找不出 Bug 了,呜……

蚂蜂略丑求原谅

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=1000086,M=500086,MX=100086;
int n,m,mx,ck,a[N],tmp[N],cnt[MX],fa[MX],l[MX],r[MX],ans[M];
struct ques{
	int opt,l,r,x;
}que[M];
int Max(int a,int b){return a>b?a:b;}
int Min(int a,int b){return a<b?a:b;}
int read(){
	char ch=getchar();int nn=0,ssss=1;
	while(ch<'0'||ch>'9'){if(ch=='-')ssss*=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){nn=nn*10+(ch-'0');ch=getchar();}
	return nn*ssss;
}
int getfa(int x){return fa[x]==x?x:fa[x]=getfa(fa[x]);}
bool Merge(int x,int y){//合并两个数值集合
	int u=getfa(x),v=getfa(y);
	fa[u]=v;cnt[v]+=cnt[u];cnt[u]=0;
	return true;
}
bool work(int np){//逐块处理
	int maxn=0,tag=0;
	for(int i=1;i<=mx;i++)fa[i]=i,cnt[i]=0;
	for(int i=l[np];i<=r[np];i++)maxn=Max(maxn,a[i]),cnt[a[i]]++,tmp[i]=a[i];
	for(int i=1;i<=m;i++){
		if(que[i].r<l[np]||que[i].l>r[np])continue;
		if(que[i].l<=l[np]&&que[i].r>=r[np]){//整块在区间内
			if(que[i].opt&1){//修改
				if(maxn>2*que[i].x){//处理方式1
					for(int j=1;j<=que[i].x;j++)
						Merge(j+tag,j+tag+que[i].x);
					maxn-=que[i].x;tag+=que[i].x;
				}
				else{//处理方式2
					for(int j=maxn;j>que[i].x;j--)
						Merge(j+tag,j+tag-que[i].x);
					maxn=Min(maxn,que[i].x);
				}
			}
			else{//查询
				if(que[i].x>maxn)continue;
				ans[i]+=cnt[getfa(que[i].x+tag)];
			}
		}
		else{//部分包含
			if(que[i].opt&1){//修改
				for(int j=Max(l[np],que[i].l);j<=Min(r[np],que[i].r);j++){
					tmp[j]=getfa(tmp[j]);
					if(tmp[j]>que[i].x+tag){cnt[tmp[j]]--;tmp[j]-=que[i].x;cnt[tmp[j]]++;}
				}
			}
			else{//查询
				for(int j=Max(l[np],que[i].l);j<=Min(r[np],que[i].r);j++){
					tmp[j]=getfa(tmp[j]);
					ans[i]+=(tmp[j]==que[i].x+tag);
				}
			}
		}
	}
	return true;
}
int main(){
	n=read();m=read();
	for(int i=1;i<=n;i++)a[i]=read(),mx=Max(mx,a[i]);
	ck=sqrt(n);//分块
	for(int i=1;i<=ck;i++)l[i]=r[i-1]+1,r[i]=i*sqrt(n);
	if(r[ck]<n){++ck;l[ck]=r[ck-1]+1;r[ck]=n;}
	for(int i=1;i<=m;i++){
		que[i].opt=read();que[i].l=read();que[i].r=read();que[i].x=read();
	}
	for(int i=1;i<=ck;i++)
		work(i);
	for(int i=1;i<=m;i++)if(que[i].opt&2)printf("%d\n",ans[i]);
}

翻遍了现在还留着的所有提交记录,竟然没有一份和我挂一样的

2021/5/17 17:59
加载中...