题目链接:https://www.luogu.com.cn/problem/P9869
我的输出:1 12
#include<bits/stdc++.h>
using namespace std;
const int N=100300;
int n,m,c,a,b;
struct node
{
int f=0;
int sum,l,r;
//sum为开灯总数
}tr[N<<2];
void up(int k)
{
tr[k].sum+=tr[k*2].sum+tr[k*2+1].sum;
return;
}
void build(int k,int l,int r)
{
tr[k].l=l;
tr[k].r=r;//!
if(l==r)
{
tr[k].sum=0;
return;
}
int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k*2+1,mid+1,r);
}
void down(int k)
{
// cout<<"aa "<<k<<" "<<tr[k].l<<" "<<tr[k].r<<endl;
tr[k*2].sum=tr[k*2].r-tr[k*2].l+1-tr[k*2].sum;
tr[k*2+1].sum=tr[k*2+1].r-tr[k*2+1].l+1-tr[k*2+1].sum;
//因为整个k区间相反操作 就等于块长减去原来总数
if(tr[k<<1].f)
tr[k<<1].f=0;
else
tr[k<<1].f=1;
if(tr[k*2+1].f)
tr[k*2+1].f=0;
else
tr[k*2+1].f=1;
tr[k].f=0;
return;//!
}
void change(int k,int l,int r)
{
int x=tr[k].l,y=tr[k].r;
//printf("%d %d %d\n",k,x,y);
if(y<=r && x>=l)
{
tr[k].sum=y-x+1-tr[k].sum;
if(tr[k].f)
tr[k].f=0;
else
tr[k].f=1;
return;
}
if(tr[k].f)
down(k);
int mid=(x+y)>>1;
if(a<=mid)
change(k<<1,l,r);//!
if(b>mid)
change(k*2+1,l,r);
up(k);
}
int find(int k,int l,int r)
{
int x=tr[k].l,y=tr[k].r;
if(y<=r && x>=l)
return tr[k].sum;
if(tr[k].f)
down(k);
int ans=0;//在外面赋0
int mid=(x+y)>>1;
if(a<=mid)
ans+=find(k<<1,l,r);//!
if(b>mid)
ans+=find(k*2+1,l,r);
return ans;
}
int main()
{
cin>>n>>m;
build(1,1,n);
while(m--)
{
cin>>c>>a>>b;
if(c==0)
change(1,a,b);
else
cout<<find(1,a,b)<<"\n";
}
return 0;
}
标签:return,int,tr,sum,样例,c++,down,ans,TJOI2009 From: https://www.cnblogs.com/suill/p/18302032