调了半天程序,硬是没发现问题,交上去只有10分(AC on #2),可自己手动造样例程序输出也跟自己手算的一样。过路大佬请指个点吧QAQ。
分块程序:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,c,z[100005],id[100005],sum1[1000],tag[1000],f,a,b,m;
void xg(int x,int y){
int l=id[x],r=id[y];
for(int i=x;i<=min(y,l*c);i++){
z[i]^=1;
if(z[i]==1) sum1[l]++;
else sum1[l]--;
}
if(l!=r){
for(int i=r*c-c+1;i<=y;i++){
z[i]^=1;
if(z[i]==1) sum1[r]++;
else sum1[r]--;
}
}
for(int i=l+1;i<=r-1;i++){
tag[i]^=1;
sum1[i]=c-sum1[i];
}
return;
}
void chat(int x,int y){
int ans=0;
int l=id[x],r=id[y];
for(int i=x;i<=min(y,l*c);i++){
ans+=(z[i]^tag[l]);
}
if(l!=r){
for(int i=r*c-c+1;i<=y;i++){
ans+=(z[i]^tag[r]);
}
}
for(int i=l+1;i<=r-1;i++){
ans+=sum1[i];
}
cout<<ans<<"\n";
return;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m;
c=sqrt(n);
for(int i=1;i<=n;i++){
id[i]=(i-1)/c+1;
}
for(int i=1;i<=m;i++){
cin>>f>>a>>b;
if(f==1){
if(a<=b) chat(a,b);
else chat(b,a);
}
else{
if(a<=b) xg(a,b);
else xg(b,a);
}
}
return 0;
}