社区讨论
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 条回复,欢迎继续交流。
正在加载回复...