rt.
想用分块AC的,结果hack数据TLE了,是这道题卡分块还是我写的复杂度不对。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=2e5+5;
int n,len,q;
ll block[N],id[N],a[N],tag[N];
int calc(int x)
{
if(x==0) return 1;
else if(x==1) return 0;
}
void build()
{
len=sqrt(n);
for(int i=1;i<=n;i++)
{
id[i]=(i-1)/len+1;
block[id[i]]+=a[i];
}
}
void change(int l,int r)
{
int p1=id[l],p2=id[r];
if(p1==p2)
{
for(int i=l;i<=r;i++)
{
a[i]=calc(a[i]);
block[p1]=len-(r-l+1);
}
return;
}
for(int i=l;i<=p1*len;i++)
{
a[i]=calc(a[i]);
block[p1]=len-(p1*len-l+1);
}
for(int i=(p2-1)*len+1;i<=min(r,n);i++)
{
a[i]=calc(a[i]);
block[p2]=len-(min(r,n)-((p2-1)*len+1)+1);
}
for(int i=p1+1;i<=p2-1;i++)
{
block[i]=len-block[i];
tag[i]=calc(tag[i]);
}
}
void pushdown(int k)
{
if(tag[k])
{
for(int i=(k-1)*len+1;i<=k*len;i++)
{
a[i]=calc(a[i]);
}
tag[k]=0;
}
return ;
}
ll query(int l,int r)
{
int p1=id[l],p2=id[r];
pushdown(p1);
pushdown(p2);
ll ans=0;
if(p1==p2)
{
for(int i=l;i<=r;i++)
{
ans+=a[i];
}
return ans;
}
for(int i=l;i<=p1*len;i++)
{
ans+=a[i];
}
for(int i=(p2-1)*len+1;i<=min(r,n);i++)
{
ans+=a[i];
}
for(int i=p1+1;i<=p2-1;i++)
{
ans+=block[i];
}
return ans;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>q;
while(q--)
{
int op,l,r;
cin>>op>>l>>r;
if(op==0) change(l,r);
else cout<<query(l,r)<<'\n';
}
return 0;
}