社区讨论
WA60分求调
P4344[SHOI2015] 脑洞治疗仪参与者 3已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mkm0uf0w
- 此快照首次捕获于
- 2026/01/20 11:15 4 周前
- 此快照最后确认于
- 2026/01/20 14:02 4 周前
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+20;
int n,T;
struct Brain{
int l,r,len,lmax,rmax,ans,lazy,sum;
}z[N*4];
void pushup(int x){
z[x].sum=z[x<<1].sum+z[x<<1|1].sum;
if(z[x<<1].lmax!=z[x<<1].len) z[x].lmax=z[x<<1].lmax;
else z[x].lmax=z[x<<1].lmax+z[x<<1|1].lmax;
if(z[x<<1|1].rmax!=z[x<<1|1].len) z[x].rmax=z[x<<1|1].rmax;
else z[x].rmax=z[x<<1|1].rmax+z[x<<1].rmax;
z[x].ans=max(max(z[x<<1].ans,z[x<<1|1].ans),z[x<<1].rmax+z[x<<1|1].lmax);
}
void build(int l,int r,int x){
z[x].l=l,z[x].r=r;
z[x].len=r-l+1;
z[x].ans=z[x].lazy=0;
if(l==r){
z[x].lmax=z[x].rmax=0;
z[x].sum=1;
return ;
}
int mid=l+r>>1;
build(l,mid,x<<1),build(mid+1,r,x<<1|1);
pushup(x);
}
void pushdown(int x){
if(!z[x].lazy) return ;
if(z[x].lazy==1){
z[x<<1].sum=z[x<<1|1].sum=0;
z[x<<1].lmax=z[x<<1].rmax=z[x<<1].ans=z[x<<1].len;
z[x<<1|1].lmax=z[x<<1|1].rmax=z[x<<1|1].ans=z[x<<1|1].len;
z[x<<1].lazy=z[x<<1|1].lazy=1;
z[x].lazy=0;
return ;
}
if(z[x].lazy==2){
z[x<<1].sum=z[x<<1].len;
z[x<<1|1].sum=z[x<<1|1].len;
z[x<<1].lmax=z[x<<1|1].lmax=z[x<<1].rmax=z[x<<1|1].rmax=z[x<<1].ans=z[x<<1|1].ans=0;
z[x<<1].lazy=z[x<<1|1].lazy=2;
z[x].lazy=0;
return ;
}
}
void change0(int l,int r,int x){
if(z[x].l>=l&&z[x].r<=r){
z[x].lazy=1;
z[x].ans=z[x].lmax=z[x].rmax=z[x].len;
z[x].sum=0;
return ;
}
pushdown(x);
int mid=z[x].l+z[x].r>>1;
if(l<=mid) change0(l,r,x<<1);
if(r>mid) change0(l,r,x<<1|1);
pushup(x);
}
void change1(int l,int r,int x){
if(z[x].l>=l&&z[x].r<=r){
z[x].lazy=2;
z[x].ans=z[x].lmax=z[x].rmax=0;
z[x].sum=z[x].len;
return ;
}
pushdown(x);
int mid=z[x].l+z[x].r>>1;
if(l<=mid) change1(l,r,x<<1);
if(r>mid) change1(l,r,x<<1|1);
pushup(x);
}
int query0(int l,int r,int x){
if(z[x].l>=l&&z[x].r<=r){
return z[x].ans;
}
pushdown(x);
int mid=z[x].l+z[x].r>>1;
if(z[x<<1].r<l) return query0(l,r,x<<1|1);
if(z[x<<1|1].l>r) return query0(l,r,x<<1);
return max(max(query0(l,r,x<<1),query0(l,r,x<<1|1)),min(z[x<<1].rmax,z[x<<1|1].l-l)+min(z[x<<1|1].lmax,r-z[x<<1].r));
}
int query1(int l,int r,int x){
if(z[x].l>=l&&z[x].r<=r){
return z[x].sum;
}
pushdown(x);
int mid=z[x].l+z[x].r>>1,ans=0;
if(l<=mid) ans=query1(l,r,x<<1);
if(r>mid) ans+=query1(l,r,x<<1|1);
return ans;
}
int opt,l,r,ll,rr;
signed main(){
cin>>n>>T;
build(1,n,1);
while(T--){
cin>>opt;
if(opt==0){
cin>>l>>r;
change0(l,r,1);
}
if(opt==1){
cin>>l>>r>>ll>>rr;
int p=query1(l,r,1),L=ll,R=-1;
if(p<=0) continue;
change0(l,r,1);
while(ll<=rr){
int mid=ll+rr>>1;
if(query0(L,mid,1)<=p){
ll=mid+1,R=mid;
}
else{
rr=mid-1;
}
}
//cout<<p<<" "<<L<<" "<<R<<"\n";
if(R!=-1&&R>=L) change1(L,R,1);
}
if(opt==2){
cin>>l>>r;
cout<<query0(l,r,1)<<"\n";
}
}
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...