我的code咋啦
查看原帖
我的code咋啦
171513
Polariserist楼主2020/12/30 16:45
#include<bits/stdc++.h>
using namespace std;
#define int unsigned long long
const int size=257,otk=507,maxn=100500;
struct seniorious{
	int num,rt;
}s[otk][maxn],*A,*B;
int pre[maxn],pos[maxn],a[maxn],ma[maxn],n,m,be[maxn],op,l,r,v,p,q,ans,lz[maxn];
inline int get(int x){
	while(x^pre[x]){
		x=pre[x]=pre[pre[x]];
	}
	return x;
}
inline void push(int x){
	for(register int i=x*size-size+1;i<=x*size;i++){
		a[i]=pos[get(i)];
		s[x][a[i]].rt=s[x][a[i]].num=0;
		a[i]-=lz[x];
	}
	for(register int i=x*size-size+1;i<=x*size;i++){
		pre[i]=0;
	}
	lz[x]=0;
}
inline void reb(int x){
	ma[x]=0;
	for(register int i=x*size-size+1;i<=x*size;i++){
		if(a[i]>ma[x]){
			ma[x]=a[i];
		}
		s[x][a[i]].rt?pre[i]=s[x][a[i]].rt:(pos[i]=a[i],s[x][a[i]].rt=i,pre[i]=i);
		s[x][a[i]].num++;
	}
}
void play(int x,int a,int b){
	A=&s[x][a];
	B=&s[x][b];
	B->rt?pre[A->rt]=B->rt:(B->rt=A->rt,pos[A->rt]=b);
	B->num+=A->num;
	A->num=A->rt=0;
}
inline void det(int x,int v){
	int &p=lz[x],&q=ma[x];
	if((v<<1)<=q-p){
		for(register int i=p+1;i<=p+v;i++){
			if(s[x][i].rt){
				play(x,i,i+v);
			}
		}
		p+=v;
	}
	else{
		for(register int i=q;i>p+v;i--){
			if(s[x][i].rt){
				play(x,i,i-v);
			}
		}
		q=std::min(q,p+v);
	}
}
signed main(){
	std::ios::sync_with_stdio(0);
	std::cin.tie(0);
	std::cout.tie(0);
	std::cin>>n>>m;
	for(register int i=1;i<=n;i++){
		std::cin>>a[i];
		be[i]=(i-1)/size+1;
	}
	for(register int i=1;i<=be[n];i++){
		reb(i);
	}
	while(m--){
		std::cin>>op>>l>>r>>v;
		switch(op){
			case 1:
				p=be[l];
				q=be[r];
				if(p^q){
					push(p);
					push(q);
					for(register int i=l;i<=p*size;i++){
						if(a[i]>v){
							a[i]-=v;
						}
					}
					for(register int i=q*size-size+1;i<=r;i++){
						if(a[i]>v){
							a[i]-=v;
						}
					}
					for(int i=p+1;i<q;i++){
						det(i,v);
					}
					reb(p);
					reb(q);
				}
				else{
					push(p);
					for(register int i=l;i<=r;i++){
						if(a[i]>v){
							a[i]-=v;
						}
					}
					reb(p);
				}
				break;
			case 2:
				p=be[l];
				q=be[r];
				ans=0;
				if(p^q){
					for(register int i=l;i<=p*size;i++){
						if(pos[get(i)]-lz[p]==v){
							ans++;
						}
					}
					for(register int i=q*size-size+1;i<=r;i++){
						if(pos[get(i)]-lz[q]==v){
							ans++;
						}
					}
					for(register int i=p+1;i<q;i++){
						if(v+lz[i]<maxn){
							ans+=s[i][v+lz[i]].num;
						}
					}
				}
				else{
					for(register int i=l;i<=r;i++){
						if(pos[get(i)]-lz[p]==v){
							ans++;
						}
					}
				}
				std::cout<<ans<<'\n';
				break;
		}
	}
}

WA

2020/12/30 16:45
加载中...