wukaichen888 @ 2023-01-19 12:22:25
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int n,q,a[N];
struct node{
int len,sum0,sum1,lmax0,rmax0,maxx0,lmax1,rmax1,maxx1;
bool tag1,tag2,tag3;
}tree[N<<2];
#define k1 k<<1
#define k2 k<<1|1
#define ls k<<1,l,mid
#define rs k<<1|1,mid+1,r
void add(int k,int l,int r,int d){
if(!d){
tree[k].tag1=1;
tree[k].tag2=tree[k].tag3=0;
tree[k].sum0=tree[k].lmax0=tree[k].rmax0=tree[k].maxx0=tree[k].len;
tree[k].sum1=tree[k].lmax1=tree[k].rmax1=tree[k].maxx1=0;
}
if(d==1){
tree[k].tag2=1;
tree[k].tag1=tree[k].tag3=0;
tree[k].sum0=tree[k].lmax0=tree[k].rmax0=tree[k].maxx0=0;
tree[k].sum1=tree[k].lmax1=tree[k].rmax1=tree[k].maxx1=tree[k].len;
}
if(d==2){
tree[k].tag3^=1;
swap(tree[k].sum0,tree[k].sum1);
swap(tree[k].lmax0,tree[k].lmax1);
swap(tree[k].rmax0,tree[k].rmax1);
swap(tree[k].maxx0,tree[k].maxx1);
}
}
void pushdown(int k,int l,int r){
int mid=(l+r)>>1;
if(tree[k].tag1){
add(ls,0);
add(rs,0);
tree[k].tag1=0;
}
if(tree[k].tag2){
add(ls,1);
add(rs,1);
tree[k].tag2=0;
}
if(tree[k].tag3){
add(ls,2);
add(rs,2);
tree[k].tag3=0;
}
}
node pushup(node x,node y){
node z;
z.len=x.len+y.len;
z.sum0=x.sum0+y.sum0;
z.sum1=x.sum1+y.sum1;
z.lmax0=x.lmax0;
if(x.sum0==x.len)
z.lmax0=x.len+y.lmax0;
z.lmax1=x.lmax1;
if(x.sum1==x.len)
z.lmax1=x.len+y.lmax1;
z.rmax0=y.rmax0;
if(y.sum0==y.len)
z.rmax0=y.len+x.rmax0;
z.rmax1=y.rmax1;
if(y.sum1==y.len)
z.rmax1=y.len+x.rmax1;
z.maxx0=x.rmax0+y.lmax0;
z.maxx1=x.rmax1+y.lmax1;
z.tag1=z.tag2=z.tag3=0;
return z;
}
void pre(int k,int l,int r){
tree[k].len=r-l+1;
if(l==r){
add(k,l,r,a[l]);
return ;
}
int mid=(l+r)>>1;
pre(ls);
pre(rs);
tree[k]=pushup(tree[k<<1],tree[k<<1|1]);
}
void change1(int k,int l,int r,int x,int y,int d){
if(x<=l&&r<=y){
add(k,l,r,d);
return ;
}
int mid=(l+r)>>1;
pushdown(k,l,r);
if(x<=mid)
change1(ls,x,y,d);
if(mid<y)
change1(rs,x,y,d);
tree[k]=pushup(tree[k<<1],tree[k<<1|1]);
}
node query(int k,int l,int r,int x,int y){
if(x<=l&&r<=y)
return tree[k];
int mid=(l+r)>>1;
pushdown(k,l,r);
if(x<=mid&&mid<y)
return pushup(query(ls,x,y),query(rs,x,y));
if(x<=mid)
return query(ls,x,y);
if(mid<y)
return query(rs,x,y);
}
int main(){
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
pre(1,1,n);
int op,x,y;
while(q--){
scanf("%d%d%d",&op,&x,&y);
x++,y++;
if(op<3)
change1(1,1,n,x,y,op);
else
if(op==3)
printf("%d\n",query(1,1,n,x,y).sum1);
else
if(op==4)
printf("%d\n",query(1,1,n,x,y).maxx1);
}
return 0;
}
by wukaichen888 @ 2023-01-19 13:02:28
出金惹!啊 ... 不对,AC 惹!
z.maxx0=x.rmax0+y.lmax0;
z.maxx1=x.rmax1+y.lmax1;
改成
z.maxx0=max({x.maxx0,y.maxx0,x.rmax0+y.lmax0});
z.maxx1=max({x.maxx1,y.maxx1,x.rmax1+y.lmax1});
by wukaichen888 @ 2023-01-19 13:03:49
一下是 AC 代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int n,q,a[N];
struct node{
int len,sum0,sum1,lmax0,rmax0,maxx0,lmax1,rmax1,maxx1;
bool tag1,tag2,tag3;
}tree[N<<2];
#define k1 k<<1
#define k2 k<<1|1
#define ls k<<1,l,mid
#define rs k<<1|1,mid+1,r
void add(int k,int l,int r,int d){
if(!d){
tree[k].tag1=1;
tree[k].tag2=tree[k].tag3=0;
tree[k].sum0=tree[k].lmax0=tree[k].rmax0=tree[k].maxx0=tree[k].len;
tree[k].sum1=tree[k].lmax1=tree[k].rmax1=tree[k].maxx1=0;
}
if(d==1){
tree[k].tag2=1;
tree[k].tag1=tree[k].tag3=0;
tree[k].sum0=tree[k].lmax0=tree[k].rmax0=tree[k].maxx0=0;
tree[k].sum1=tree[k].lmax1=tree[k].rmax1=tree[k].maxx1=tree[k].len;
}
if(d==2){
tree[k].tag3^=1;
swap(tree[k].sum0,tree[k].sum1);
swap(tree[k].lmax0,tree[k].lmax1);
swap(tree[k].rmax0,tree[k].rmax1);
swap(tree[k].maxx0,tree[k].maxx1);
}
}
void pushdown(int k,int l,int r){
int mid=(l+r)>>1;
if(tree[k].tag1){
add(ls,0);
add(rs,0);
tree[k].tag1=0;
}
if(tree[k].tag2){
add(ls,1);
add(rs,1);
tree[k].tag2=0;
}
if(tree[k].tag3){
add(ls,2);
add(rs,2);
tree[k].tag3=0;
}
}
node pushup(node x,node y){
node z;
z.len=x.len+y.len;
z.sum0=x.sum0+y.sum0;
z.sum1=x.sum1+y.sum1;
z.lmax0=x.lmax0;
if(x.sum0==x.len)
z.lmax0=x.len+y.lmax0;
z.lmax1=x.lmax1;
if(x.sum1==x.len)
z.lmax1=x.len+y.lmax1;
z.rmax0=y.rmax0;
if(y.sum0==y.len)
z.rmax0=y.len+x.rmax0;
z.rmax1=y.rmax1;
if(y.sum1==y.len)
z.rmax1=y.len+x.rmax1;
z.maxx0=max({x.maxx0,y.maxx0,x.rmax0+y.lmax0});
z.maxx1=max({x.maxx1,y.maxx1,x.rmax1+y.lmax1});
z.tag1=z.tag2=z.tag3=0;
return z;
}
void pre(int k,int l,int r){
tree[k].len=r-l+1;
if(l==r){
add(k,l,r,a[l]);
return ;
}
int mid=(l+r)>>1;
pre(ls);
pre(rs);
tree[k]=pushup(tree[k<<1],tree[k<<1|1]);
}
void change1(int k,int l,int r,int x,int y,int d){
if(x<=l&&r<=y){
add(k,l,r,d);
return ;
}
int mid=(l+r)>>1;
pushdown(k,l,r);
if(x<=mid)
change1(ls,x,y,d);
if(mid<y)
change1(rs,x,y,d);
tree[k]=pushup(tree[k<<1],tree[k<<1|1]);
}
node query(int k,int l,int r,int x,int y){
if(x<=l&&r<=y)
return tree[k];
int mid=(l+r)>>1;
pushdown(k,l,r);
if(x<=mid&&mid<y)
return pushup(query(ls,x,y),query(rs,x,y));
if(x<=mid)
return query(ls,x,y);
if(mid<y)
return query(rs,x,y);
}
int main(){
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
pre(1,1,n);
int op,x,y;
while(q--){
scanf("%d%d%d",&op,&x,&y);
x++,y++;
if(op<3)
change1(1,1,n,x,y,op);
else
if(op==3)
printf("%d\n",query(1,1,n,x,y).sum1);
else
if(op==4)
printf("%d\n",query(1,1,n,x,y).maxx1);
}
return 0;
}
附测试数据
10 6
0 0 0 1 1 0 1 0 1 1
1 3 8
0 6 7
2 1 10
3 1 8
3 1 8
4 1 7
by yizhiming @ 2023-02-17 19:15:43
@wukaichen888 srds哥们你这数据是不是有误,原题下标从0开始,你这范围应该是0-9吧,咋有个
2 1 10
嘞
by wukaichen888 @ 2023-02-17 21:13:30
抱歉我是傻逼 qwq