10pts寻求帮助
查看原帖
10pts寻求帮助
666464
797yy楼主2024/3/18 14:17

只能过#2求调

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e5+8;
#define ls (x<<1)
#define rs (x<<1|1)
struct Tree
{
   int l,r;
   int sum;
   bool tag;
   int nowon;
}tree[N<<2];
void pushdown(int x)
{
    if(tree[x].tag)
    {
        tree[ls].nowon=tree[ls].sum-tree[ls].nowon;
        tree[ls].tag^=1;
        tree[rs].nowon=tree[rs].sum-tree[rs].nowon;
        tree[rs].tag^=1;
        tree[x].tag=0;
    }
}
void buildtree(int x,int l,int r)
{
    tree[x].l=l;
    tree[x].r=r;
    tree[x].sum=r-l+1;
    tree[x].tag=0;
    tree[x].nowon=r-l+1;
    if(l==r) return;
    int mid=(l+r)>>1;
    buildtree(ls,l,mid);
    buildtree(rs,mid+1,r);
    //tree[x].nowon=tree[ls].nowon+tree[rs].nowon;
    return ;
}
void edittree(int x,int l,int r)
{

    if(l<=tree[x].l&&tree[x].r<=r)
    {
        tree[x].tag^=1;
        tree[x].nowon=tree[x].sum-tree[x].nowon;
        return ;
    }
    pushdown(x);
    int mid=(tree[x].l+tree[x].r)/2;
    if(mid>=l)
    edittree(ls,l,r);
    if(mid<r)
    edittree(rs,l,r);
    tree[x].nowon=tree[ls].nowon+tree[rs].nowon;
    return;
}

int query(int x,int l,int r)
{
    int ans=0;
    if(l<=tree[x].l&&tree[x].r<=r)
    {
        return tree[x].nowon;
    }
    pushdown(x);
    int mid=(tree[x].l+tree[x].r)>>1;
    if(mid>=l)
    ans=query(ls,l,r);
    if(mid<r)
    ans+=query(rs,l,r);
    //tree[x].nowon=ans;
    return ans;
}
int main()
{
    int n,m;
    cin>>n>>m;
    int a,b,c;
    buildtree(1,1,n);
    for(int i=1;i<=m;i++)
    {
        cin>>c>>a>>b;
        if(c==0)
        {
            edittree(1,a,b);
        }
        else if(c==1)
        {
            cout<<query(1,a,b)<<endl;
        }
    }
    return 0;
}
2024/3/18 14:17
加载中...