调!!!
  • 板块P2574 XOR的艺术
  • 楼主JMxxxx
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/7/22 18:53
  • 上次更新2025/7/22 23:27:27
查看原帖
调!!!
553871
JMxxxx楼主2025/7/22 18:53
#include<bits/stdc++.h>
using namespace std;
const int N=1e6;
char a[N];
struct node{
    int l,r;
    int lz=0;
    int sum;
}tree[N<<2];
int n,m;
void build(int x,int l,int r)
{
    tree[x].l=l,tree[x].r=r;tree[x].lz=0;
    if(l==r)
    {
        tree[x].sum=a[l]-'0';
        cout<<tree[x].sum;
        return ;
    }
    int mid=l+r>>1;
    build(x<<1,l,mid);
    build(x<<1|1,mid+1,r);
    tree[x].sum=tree[x<<1].sum+tree[x<<1|1].sum;
}
void pushdown(int x)
{
    if(tree[x].lz==1)
    {
        tree[x<<1].sum=(tree[x<<1].r-tree[x<<1].l+1-tree[x<<1].sum);
        tree[x<<1|1].sum=(tree[x<<1|1].r-tree[x<<1|1].l+1-tree[x<<1|1].sum);

        tree[x<<1].lz^=1;
        tree[x<<1|1].lz^=1;

        tree[x].lz=0;
    }
}
void change(int x,int l,int r)
{
    if(l<=tree[x].l&&tree[x].r<=r)
    {
        tree[x].sum=tree[x].r-tree[x].l+1-tree[x].sum;
        tree[x].lz^=1;
        return ;
    }
    pushdown(x);
    int mid=tree[x].l+tree[x].r>>1;
    if(l<=mid)change(x<<1,l,mid);
    if(r>mid) change(x<<1|1,mid+1,r);
    tree[x].sum=tree[x<<1].sum+tree[x<<1|1].sum;
}
int ask(int x,int l,int r)
{
    int ans=0;
    if(l<=tree[x].l&&tree[x].r<=r)return tree[x].sum;
    pushdown(x);
    int mid=tree[x].l+tree[x].r>>1;
    if(l<=mid)ans+=ask(x<<1,l,mid);
    if(r>mid) ans+=ask(x<<1|1,mid+1,r);
    return ans;
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)cin>>a[i];
    build(1,1,n);
    for(int i=1;i<=m;i++)
    {
        int p,x,y;cin>>p>>x>>y;
        if(p==0)
        {
            change(1,x,y);
        }
        if(p==1)
        {
            cout<<ask(1,x,y)<<endl;
        }
    }
}
2025/7/22 18:53
加载中...