求调……
查看原帖
求调……
46699
syf1201楼主2021/6/2 16:13

WA on 2、3、4、6、11。

#include<cmath>
#include<cstdio>
#include<cstring>
#define mn 1000005
#define mm 500005
#define xx 100005
#define mt 1005
#define reg register
#define min(x,y) (x<y?x:y)
#define max(x,y) (x>y?x:y)
int a[mn],bl[mn],l[mt],r[mt],ans[mm];
int mx,del,b[xx],pa[mn],cnt[xx];
struct node {
	int opt,l,r,x;
} o[mm];
inline int read() {
	reg int temp=0;
	reg char ch=getchar();
	for(; ch<'0'||ch>'9'; ch=getchar()) ;
	for(; ch>='0'&&ch<='9'; ch=getchar()) temp=(temp<<1)+(temp<<3)+(ch^48);
	return temp;
}
inline void build(reg int le,reg int ri) {
	reg int i;
	del=mx=0;
	for(i=le; i<=ri; ++i) {
		mx=max(mx,a[i]);
		if(!b[a[i]]) b[a[i]]=i;
		++cnt[a[i]];
		pa[i]=b[a[i]];
	}
}
inline int find(reg int x) {
	for(; x!=pa[x]; x=pa[x]) ;
	return x;
}
int main() {
	reg int n,m,t,i,j,blo,le,ri,x;
	n=read();
	m=read();
	t=sqrt(n);
	for(i=1; i<=n; ++i) a[i]=read();
	for(i=1; i<=n; ++i) bl[i]=(i-1)/t+1;
	for(blo=1; blo<=bl[n]; ++blo) l[blo]=r[blo-1]+1,r[blo]=r[blo-1]+t;
	r[bl[n]]=n;
	for(i=1; i<=m; ++i) o[i]={read(),read(),read(),read()};
	for(blo=1; blo<=bl[n]; ++blo) {
		build(l[blo],r[blo]);
		for(i=1; i<=m; ++i) {
			le=max(o[i].l,l[blo]);
			ri=min(o[i].r,r[blo]);
			if(le>ri) continue;
			x=o[i].x;
			switch(o[i].opt) {
				case 1:
					if(le==l[blo]&&ri==r[blo]) {
						if(mx-del<=x) break;
						if(mx-del>=(x<<1)) {
							for(j=x; j!=-1; --j) {
								if(!b[j+del]) continue;
								if(b[j+x+del]) pa[b[j+del]]=b[j+x+del],cnt[j+x+del]+=cnt[j+del];
								else a[b[j+del]]=j+x+del,cnt[j+x+del]=cnt[j+del],b[j+x+del]=b[j+del];
								b[j+del]=cnt[j+del]=0;
							}
							del+=x;
							break;
						}
						for(j=x+1; j+del<=mx; ++j) {
							if(!b[j+del]) continue;
							if(b[j+del-x]) pa[b[j+del]]=b[j+del-x],cnt[j+del-x]+=cnt[j+del];
							else a[b[j+del]]=j+del-x,cnt[j+del-x]=cnt[j+del],b[j+del-x]=b[j+del];
							b[j+del]=cnt[j+del]=0;
						}
						for(j=x; j; --j)
							if(b[j+del]) {
								mx=j+del;
								break;
							}
					} else {
						for(j=l[blo]; j<=r[blo]; ++j)
							a[j]=a[find(j)],b[a[j]]=cnt[a[j]]=0;
						for(j=l[blo]; j<=r[blo]; ++j)
							a[j]-=del;
						for(j=le; j<=ri; ++j)
							if(a[j]>x) a[j]-=x;
						build(l[blo],r[blo]);
					}
					break;
				case 2:
					if(le==l[blo]&&ri==r[blo]) ans[i]+=cnt[x+del];
					else {
						for(j=le; j<=ri; ++j) if(a[find(j)]==x+del) ++ans[i];
					}
					break;
			}
		}
		for(i=l[blo]; i<=r[blo]; ++i)
			b[a[i]]=cnt[a[i]]=0;
	}
	for(i=1; i<=m; ++i) if(o[i].opt==2) printf("%d\n",ans[i]);
	return 0;
}
2021/6/2 16:13
加载中...