P3870 WA 10pts 求调

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
int n,m;
int a[N],ans[N],add[N],pos[N];
int block;
void pls(int l,int r){
	int nl=pos[l],nr=pos[r];
	if(nl==nr){
		for(int i=l;i<=r;i++){
			if((a[i]+add[nl])%2==0) ans[nl]++;
			else ans[nl]--;
			a[i]^=1;
		}
		return;
	}
	for(int i=nl+1;i<nr;i++){
		add[i]^=1;
		ans[i]=block-ans[i];
	}
	for(int i=l;i<=block*nl;i++){
		if((a[i]+add[nl])%2==0) ans[nl]++;
		else ans[nl]--;
		a[i]^=1;
	}
	for(int i=block*(nr-1)+1;i<=r;i++){
		if((a[i]+add[nr])%2==0) ans[nr]++;
		else ans[nr]--;
		a[i]^=1;
	}
}
void query(int l,int r){
	int nl=pos[l],nr=pos[r];
	int res=0;
	if(nl==nr){
		for(int i=l;i<=r;i++){
			res+=(a[i]+ans[nl])%2;
		}
		printf("%lld\n",res);
		return;
	}
	for(int i=nl+1;i<nr;i++) res+=ans[i];
	for(int i=l;i<=block*nl;i++) res+=(a[i]+add[nl])%2;
	for(int i=block*(nr-1)+1;i<=r;i++) res+=(a[i]+add[nr])%2;
	printf("%lld\n",res);
}
signed main(){
    scanf("%lld%lld",&n,&m);
    block=sqrt(n);
    for(int i=1;i<=n;i++){
    	pos[i]=(i-1)/block+1;
	}
	for(int i=1;i<=m;i++){
		int op,l,r;
		scanf("%lld%lld%lld",&op,&l,&r);
		if(!op) pls(l,r);
		else query(l,r);
	}
    return 0;
}

样例过了的,调了一下好像有时没输出

不想去写分块毒瘤紫题,挑了道绿的,结果还是调不出来,服了

@王钰宸涵 @金杭东 @2345安全卫士 求帮忙看眼

6 我看看

好消息。
去年就AC了

坏消息,我用线段树做的

@稻叶昙 找到错误了,分块不是每个块都相等的,还得计算,直接block不行
image

1 个赞

谢谢巨佬,AC了orz

1 个赞