写完正常代码后想写动态开点结果就祭了QAQ
麻烦各位dalao了QAQ
这是结构体动态开点(后面还有正常代码)
#include<iostream>
#include<cmath>
#include<string>
#include<string.h>
#include<algorithm>
using namespace std;
const int N=2e5+5;
int n,m,cnt=1;
int a[N];
struct node
{
int l,r,sum;
int f;
}t[N*2];
void push_up(int &k)
{
t[k].sum=t[2*k].sum+t[2*k+1].sum;
}
void push_down(int k)
{
t[2*k].f^=1;
t[2*k+1].f^=1;
t[2*k].sum=t[2*k].r-t[2*k].l+1-t[2*k].sum;
t[2*k+1].sum=t[2*k+1].r-t[2*k+1].l+1-t[2*k+1].sum;
t[k].f=0;
}
void build(int &k,int l,int r)
{
if(!k)
k=++cnt;
t[k].l=l,t[k].r=r;
if(l==r)
{
t[k].sum=a[l];
return ;
}
int mid=(l+r)/2;
build(t[k].l,l,mid);
build(t[k].r,mid+1,r);
push_up(k);
}
void update(int &k,int l,int r)
{
if(!k)
k=++cnt;
if(t[k].l>=l&&t[k].r<=r)
{
t[k].f^=1;
t[k].sum=t[k].r-t[k].l+1-t[k].sum;
return ;
}
if(t[k].f)
push_down(k);
int mid=(t[k].l+t[k].r)/2;
if(l<=mid)
update(t[k].l,l,r);
if(r>mid)
update(t[k].r,l,r);
push_up(k);
}
int query(int k,int l,int r)
{
if(!k)
return 0;
if(t[k].l>=l&&t[k].r<=r)
return t[k].sum;
int mid=(t[k].l+t[k].r)/2,tot=0;
if(t[k].f)
push_down(k);
if(l<=mid)
tot+=query(t[k].l,l,r);
if(mid<r)
tot+=query(t[k].r,l,r);
return tot;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)
{
char c;
cin>>c;
a[i]=c-'0';
}
int temp=1;
build(temp,1,n);
for(int i=1;i<=m;i++)
{
int op,l,r,temp=1;
cin>>op>>l>>r;
if(op==0)
// {
update(temp,l,r);
// cout<<query(1,1,n)<<endl;
// }
else
cout<<query(1,l,r)<<endl;
}
return 0;
}
这是正常代码
#include<iostream>
#include<cmath>
#include<string>
#include<string.h>
#include<algorithm>
using namespace std;
const int N=2e5+5;
int n,m;
int a[N];
struct node
{
int l,r,sum;
int f;
}t[N*4];
void push_up(int u)
{
t[u].sum=t[2*u].sum+t[2*u+1].sum;
}
void push_down(int u)
{
t[2*u].f^=1;
t[2*u+1].f^=1;
t[2*u].sum=t[2*u].r-t[2*u].l+1-t[2*u].sum;
t[2*u+1].sum=t[2*u+1].r-t[2*u+1].l+1-t[2*u+1].sum;
t[u].f=0;
// t[2*u].sum=len-len/2-t[2*u].sum;
// t[2*u+1].sum=len/2-t[2*u+1].sum;
}
void build(int u,int l,int r)
{
t[u].l=l,t[u].r=r;
if(l==r)
{
t[u].sum=a[l];
return ;
}
int mid=(l+r)/2;
build(2*u,l,mid);
build(2*u+1,mid+1,r);
push_up(u);
}
void update(int u,int l,int r)
{
if(t[u].l>=l&&t[u].r<=r)
{
t[u].f^=1;
t[u].sum=t[u].r-t[u].l+1-t[u].sum;
return ;
}
if(t[u].f)
push_down(u);
int mid=(t[u].l+t[u].r)/2;
if(l<=mid)
update(2*u,l,r);
if(r>mid)
update(2*u+1,l,r);
push_up(u);
}
int query(int u,int l,int r)
{
if(t[u].l>=l&&t[u].r<=r)
return t[u].sum;
int mid=(t[u].l+t[u].r)/2,tot=0;
if(t[u].f)
push_down(u);
if(l<=mid)
tot+=query(2*u,l,r);
if(mid<r)
tot+=query(2*u+1,l,r);
return tot;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)
{
char c;
cin>>c;
a[i]=c-'0';
}
build(1,1,n);
for(int i=1;i<=m;i++)
{
int op,l,r;
cin>>op>>l>>r;
if(op==0)
// {
update(1,l,r);
// cout<<query(1,1,n)<<endl;
// }
else
cout<<query(1,l,r)<<endl;
}
return 0;
}