MnZn10pts求条
查看原帖
MnZn10pts求条
703115
d909RCA楼主2024/1/22 16:29

除#2以外全WA

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m,f[1000009],a[4000009],t[4000009];
void build(int p,int l,int r)
{
    t[p]=0;
    if(l==r)
	{
		a[p]=f[l];
		return ;
	}
    int mid=(l+r)>>1;
    build(p<<1,l,mid);
    build(p<<1|1,mid+1,r);
    a[p]=a[p<<1]+a[p<<1|1];
}
void add(int x,int y,int l,int r,int p)
{
    if(x<=l&&r<=y)
    {
        a[p]=(r-l+1)-a[p];
        t[p]^=1;
        return ;
    }
    int mid=(l+r)>>1;
    if(t[p]!=0)
    {
	   	t[p<<1]^=1;
	    a[p<<1]+=t[p]*(mid-l+1);
	    t[p<<1|1]^=1;
	    a[p<<1|1]+=t[p]*(r-mid);
	    t[p]=0;
	}
    if(x<=mid) add(x,y,l,mid,p<<1);
    if(y>mid) add(x,y,mid+1,r,p<<1|1);
    a[p]=a[p<<1]+a[p<<1|1];
}
int ask(int x,int y,int l,int r,int p)
{
    int ans=0;
    if(x<=l&&r<=y) return a[p];
    int mid=(l+r)>>1;
    if(t[p]!=0)
    {
	   	t[p<<1]^=1;
	    a[p<<1]+=t[p]*(mid-l+1);
	    t[p<<1|1]^=1;
	    a[p<<1|1]+=t[p]*(r-mid);
	    t[p]=0;
	}
    if(x<=mid) ans+=ask(x,y,l,mid,p<<1);
    if(y>mid) ans+=ask(x,y,mid+1,r,p<<1|1);
    return ans;
}
signed main()
{
    cin>>n>>m;
    build(1,1,n);
    while(m--)
    {
    	int op,x,y; 
        cin>>op;
        if(op==0)
		{
            cin>>x>>y;
            add(x,y,1,n,1);
        }
        else
		{
            cin>>x>>y;
            cout<<ask(x,y,1,n,1)<<endl;
        }
    }
    return 0;
}
2024/1/22 16:29
加载中...