社区讨论

2022最后一天了,家人们救救我吧

P7447[Ynoi2007] rgxsxrs参与者 6已保存回复 13

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
13 条
当前快照
1 份
快照标识符
@lo3fwas7
此快照首次捕获于
2023/10/24 05:58
2 年前
此快照最后确认于
2023/10/24 05:58
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned ll
#define INF 0x3f3f3f3f
#define INFLL 0x3f3f3f3f3f3f3f3fll
#define For(i_,l_,r_) for(int i_=(l_);i_<=(r_);i_++)
#define Rep(i_,l_,r_) for(int i_=(l_);i_>=(r_);i_--)
#define Fork(i_,l_,r_,k_) for(int i_=(l_);i_<=(r_);i_+=k_)
#define Repk(i_,l_,r_,k_) for(int i_=(l_);i_<=(r_);i_-=k_)
#define Go(u_)       for(int i_=hd[u_],v=0;i_;i_=e[i_].nxt,v=e[i_].to)
#define Gogr(u_,gr_) for(int i_=gr_.hd[u_],v=0;i_;i_=gr_.e[i_].nxt,v=gr_.e[i_].to)
using namespace std;
#define Ci const int
#define Cl const ll
#define Cul const ull
#define Cc const char
#define _c_ getchar()
#ifdef ONLINE_JUDGE
#define getchar() (_u==_v&&(_v=(_u=_c)+fread(_c,1,inS,stdin),_u==_v)?EOF:*_u++)
#endif
//inline int _lg(Ci x){return !x?-1:31-__builtin_clz(x);}
inline int _lg(Cl x){return !x?-1:63-__builtin_clzll(x);}
//inline int _cnt(Ci x){/return __builtin_popcount(x);}
inline int _cnt(Cl x){return __builtin_popcountll(x);}
const int inS=1<<18,ouS=1<<18;int _p,_l=-1;
char _b[ouS],_d[55],_c[inS],*_u=_c,*_v=_c;
template<typename T=int>inline T read(){
	char ch=_c_;T X=0;bool fl=0;while(ch<48||ch>57)fl|=(ch==45),ch=_c_;
	while(ch>47&&ch<58)X=X*10+(ch^48),ch=_c_;if(fl)return-X;return X;
}
inline char Gec(){char ch=_c_;while(ch<33)ch=_c_;return ch;}
inline int Ges(char*K){
	int L=0;char ch=_c_;while(ch<33)ch=_c_;
	while(ch>32)*K++=ch,ch=_c_,++L;*K++=0;return L;
}
template<typename T>inline void read(T B,const T E){for(;B!=E;B++)*B=read();}
inline void flush(){fwrite(_b,1,_l+1,stdout);_l=-1;}
inline void _pc(Cc&C){if(C!=-1)_b[++_l]=C;}
inline void _chf(){if(_l>(ouS>>1))flush();}
inline void puc(Cc&C){_b[++_l]=C;}
inline void pus(Cc*K,Cc&C=10){while(*K)_b[++_l]=*K++;_pc(C);_chf();}
inline void write(Cc&C){_b[++_l]=C;}
inline void write(Cc*K){while(*K)_b[++_l]=*K++;_chf();}
template<typename T>inline void write(T X,Cc&C=-1){
	if(X<0)_b[++_l]=45,X=-X;do{_d[++_p]=(X%10)|48;}while(X/=10);
	do{_b[++_l]=_d[_p];}while(--_p);_pc(C);_chf();
}
template<typename T,typename...A>void write(const T&X,const A&...a){write(X);write(a...);}
template<typename T>inline void writel(T B,const T E,Cc&c=' ',Cc&e='\n'){
	for(;B!=E;)write(*B),_pc(++B!=E?c:e);
}
#define Writel(x) template<typename T>inline void writel(const x<T>&g,Cc&c=' ',Cc&e='\n'){writel(g.begin(),g.end(),c,e);}
Writel(initializer_list);Writel(vector);Writel(set);Writel(multiset);
inline void init(){
//    freopen("1.in","r",stdin);
//    freopen("1.out","w",stdout);
	atexit(flush);
}
Ci N_=5e5;
int n,m,a[N_+5];
namespace Block{
Ci B=20;
int N,L[N_+5],R[N_+5],bel[N_+5];
inline void build(){
	For(i,1,n){
		bel[i]=bel[i-1]+(!((i-1)%B));
		if(bel[i]!=bel[i-1])L[bel[i]]=i,R[bel[i-1]]=i-1,++N;
	}
	if(!R[bel[n]])R[bel[n]]=n;
}
}
namespace mul_Block{
Ci GG=1e9+3; 
Ci B=11,G=(int)ceil(log(GG)/log(B))+1;
struct T{
	int mx,mn,lz,siz;ll s;
	T(){mx=mn=lz=0;s=0;siz=0;}
	T(Ci x){mx=mn=x,s=x;lz=0;siz=!!x;}
	T(Ci x,Ci y,Cl z,Ci p){mx=x,mn=y,s=z;lz=0;siz=p;}
	inline T operator+(const T&U)const{
		return T(max(mx,U.mx),(mn?(U.mn?min(mn,U.mn):mn):U.mn),s+U.s,siz+U.siz);
	}
	inline void operator+=(const T&U){
		(*this)=(*this)+U;
	}
}g[N_+5];
int N,bel[N_+5];
inline void Fall(Ci id,Ci x,Ci k,Ci lz,Ci l,Ci r,Ci s);
inline void Del(Ci id,Ci x,Ci lz,Ci s);
inline T Query(Ci id,Ci x,Ci lz,Ci l,Ci r,Ci s);
struct SGT{
	int L,R,ID;T tr[(N_*4)/Block::B+5];
	#define u (s<<1)
	#define v (s<<1|1)
	inline void push_up(Ci s){
		tr[s]=tr[u]+tr[v];
	}
	void build(Ci l,Ci r,Ci s){
		if(l==r)return tr[s]=g[l],void();
		Ci mid=(l+r)>>1;
		build(l,mid,u);build(mid+1,r,v);
		push_up(s);
	}
	inline void pass(Ci s,Ci k){
		if(!tr[s].mx)return;
		tr[s].mx-=k;tr[s].mn-=k;tr[s].s-=(ll)tr[s].siz*k;tr[s].lz+=k;
	}
	inline void push_down(Ci s){
		if(!tr[s].lz)return;
		pass(u,tr[s].lz);
		pass(v,tr[s].lz);
		tr[s].lz=0;
	}
	void Add(Ci x,Ci l,Ci r,Ci s,Ci k){
//		cerr<<"@@ "<<x<<" "<<l<<" "<<r<<" "<<s<<" "<<k<<' '<<tr[5].lz<<'\n';
		if(l==r){
			Del(ID,l,tr[s].lz,s);
			tr[s]=tr[s]+T(k);
			return;
		}
		push_down(s);
		Ci mid=(l+r)>>1;
		if(x<=mid)Add(x,l,mid,u,k);
		else Add(x,mid+1,r,v,k);
		push_up(s);
//		cerr<<"@@ "<<x<<" "<<l<<" "<<r<<" "<<s<<" "<<k<<' '<<tr[5].lz<<'\n';
	}
	void update(Ci x,Ci y,Ci l,Ci r,Ci s,Ci k){
		if(tr[s].mx<=k)return;
//		cerr<<"? "<<s<<" "<<tr[s].mn<<' '<<l<<" "<<r<<" "<<x<<" "<<y<<"\n";
		if(x<=Block::L[l]&&Block::R[r]<=y){
//			cerr<<ID<<" "<<l<<' '<<r<<" "<<s<<" "<<k<<" "<<tr[s].mn<<"\n";
			if(tr[s].mn-k>=L)return pass(s,k)/*,cerr<<ID<<" "<<l<<' '<<r<<" "<<s<<" "<<k<<" "<<tr[s].lz<<"\n",void()*/;
		}
//		cerr<<"! "<<s<<" "<<tr[s].mn<<' '<<l<<" "<<r<<" "<<x<<" "<<y<<"\n";
		if(l==r){
			Fall(ID,l,k,tr[s].lz,max(Block::L[l],x),min(Block::R[l],y),s);
			return;
		}
		push_down(s);
		Ci mid=(l+r)>>1;
		if(x<=Block::R[mid])update(x,y,l,mid,u,k);
		if(y>Block::R[mid])update(x,y,mid+1,r,v,k);
		push_up(s);
//		cerr<<ID<<" "<<s<<' '<<l<<" "<<r<<" "<<mid<<" "<<x<<" "<<y<<' '<<tr[5].lz<<"\n";
	}
	T query(Ci x,Ci y,Ci l,Ci r,Ci s){
		if(x<=Block::L[l]&&Block::R[r]<=y)return tr[s];
		if(l==r){
			return Query(ID,l,tr[s].lz,max(Block::L[l],x),min(Block::R[l],y),s);
		}
		push_down(s);
		Ci mid=(l+r)>>1;
		if(y<=Block::R[mid])return query(x,y,l,mid,u);
		if(x>Block::R[mid])return query(x,y,mid+1,r,v);
		return query(x,y,l,mid,u)+query(x,y,mid+1,r,v);
	}
	#undef u
	#undef v
}t[G];
#define bn Block::N
inline void Del(Ci id,Ci x,Ci lz,Ci s){
	For(i,Block::L[x],Block::R[x])
		if(bel[i]==id)a[i]-=lz;
	t[id].tr[s].lz=0;
}
inline void Fall(Ci id,Ci x,Ci k,Ci lz,Ci l,Ci r,Ci s){
//	cerr<<"!!#@ "<<id<<" "<<x<<' '<<l<<" "<<r<<' '<<k<<' '<<t[1].tr[5].lz<<"\n";
	if(lz){
		For(i,Block::L[x],Block::R[x])
			if(bel[i]==id)a[i]-=lz;
	}
	t[id].tr[s]=T();
//	pus("????????????????");
//	writel(bel+l,bel+1+r);pus("\n???????????????????");
	For(i,l,r)
		if(bel[i]==id&&a[i]>k){
//			cerr<<a[i]<<' '<<k<<'\n';
			a[i]-=k;
			if(a[i]<t[id].L){
				Rep(j,id-1,0)
					if(t[j].L<=a[i]&&a[i]<=t[j].R){
			//			cerr<<"# "<<i<<"\n";
//						cerr<<"::: "<<i<<" "<<j<<" "<<a[i]<<'\n';
						t[j].Add(x,1,bn,1,a[i]);
						bel[i]=j;
//	cerr<<"!!#@ "<<id<<" "<<x<<' '<<l<<" "<<r<<' '<<k<<' '<<t[1].tr[5].lz<<"\n";
						break;
					}
			}
			else t[id].tr[s]+=T(a[i]);
		}
		else if(bel[i]==id)t[id].tr[s]+=T(a[i]);
	For(i,Block::L[x],l-1)if(bel[i]==id)t[id].tr[s]+=T(a[i]);
	For(i,r+1,Block::R[x])if(bel[i]==id)t[id].tr[s]+=T(a[i]);
//	cerr<<"?? "<<t[id].tr[s].mn<<" "<<t[id].tr[s].mx<<" "<<t[id].tr[s].s<<"\n";
}
inline T Query(Ci id,Ci x,Ci lz,Ci l,Ci r,Ci s){
//	cerr<<"$$$ "<<id<<' '<<x<<' '<<lz<<" "<<l<<' '<<r<<'\n';
	if(lz){
		For(i,Block::L[x],Block::R[x])
			if(bel[i]==id)a[i]-=lz;
		t[id].tr[s].lz=0;
	}
	T res;
	For(i,l,r)
		if(bel[i]==id)res=res+T(a[i]);
	return res;
}
inline void build(){
	ll now=1;
	for(;now<=GG;){
		t[N].L=(int)now;t[N].ID=N;
		now*=B;
		t[N++].R=(int)min(now,(ll)GG)-1;
//		cerr<<"! "<<t[N-1].L<<" "<<t[N-1].R<<"\n";
	}
	For(i,0,N-1){
		For(j,1,bn){
			g[j]=T();
			For(I,Block::L[j],Block::R[j]){
				if(t[i].L<=a[I]&&a[I]<=t[i].R)g[j]=g[j]+T(a[I]),bel[I]=i;
			}
//			cerr<<i<<' '<<j<<" "<<g[j].mn<<" "<<g[j].mx<<" "<<g[j].s<<"\n";
		}
		t[i].build(1,bn,1);
	}
}
inline void update(Ci x,Ci y,Ci k){
	For(i,0,N-1)t[i].update(x,y,1,bn,1,k);
}
inline T query(Ci x,Ci y){
	T res;
	For(i,0,N-1){
//		cerr<<i<<" "<<t[i].L<<" "<<t[i].R<<" "<<g.s<<" "<<g.mx<<" "<<g.mn<<'\n';
		res=res+t[i].query(x,y,1,bn,1);
	}
	return res;
}
}
inline void ypa(){
//	cerr<<mul_Block::G<<" "<<(sizeof mul_Block::t)/1048576.0<<"\n";
	n=read(),m=read();
	read(a+1,a+1+n);
	Block::build();
	mul_Block::build();
	int pre=0;
	for(;m;m--){
		Ci op=read(),l=read()^pre,r=read()^pre;
		if(op==1)mul_Block::update(l,r,read()^pre);
		if(op==2){
			mul_Block::T ans=mul_Block::query(l,r);
			write(ans.s,' ',ans.mn,' ',ans.mx,'\n');
			pre=ans.s&1048575;
		}
//		cerr<<mul_Block::t[1].tr[5].lz<<"\n"; 
//		pus("-------");
//		cerr<<"-----------"<<m<<"----------\n";
//		For(i,1,n)write(mul_Block::query(i,i).mn,' ');
//		cerr<<"-----------"<<m<<"----------\n";
//		pus("");
	}
}
signed main(){init();for(int T=1;T;T--)ypa();return 0;}

没被卡常,wa3个点 13 22 23。
思路就是倍增分块。然后最后套底层分块。6

回复

13 条回复,欢迎继续交流。

正在加载回复...