#6和#7没过,求调试
查看原帖
#6和#7没过,求调试
1193763
Shepherdzzx楼主2024/5/23 17:04
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define ld long double
using namespace std;
int n;
int m;
int arr[200005];
int ed[200005];
int st[200005];
int belong[200005];
int delta[20005];
int ans1[20005];
int num;
void modify(int l,int r){
	int x=belong[l];
	int y=belong[r];
	if(x==y){
		for(int i=l;i<=r;i++){
            ans1[x]-=(arr[i]^delta[x]);
			arr[i]^=1;
            ans1[x]+=(arr[i]^delta[x]);
		}
        return;
	}
	for(int i=l;i<=ed[x];i++){
        ans1[x]-=(arr[i]^delta[x]);
        arr[i]^=1;
        ans1[x]+=(arr[i]^delta[x]);
    }
	for(int i=st[y];i<=r;i++){
        ans1[y]-=(arr[i]^delta[y]);
        arr[i]^=1;
        ans1[y]+=(arr[i]^delta[y]);
    }
	for(int i=x+1;i<y;i++){
        delta[i]^=1;
        ans1[i]=num-ans1[i];
    }	
}
int answer(int l,int r){
	int x=belong[l];
	int y=belong[r];
	int ans=0;
	if(x==y){
		for(int i=l;i<=r;i++){
			ans+=(arr[i]^delta[x]);
		}
	}
	else {
		for(int i=l;i<=ed[x];i++){
			ans+=(arr[i]^delta[x]);
		}
		for(int i=st[y];i<=r;i++){
			ans+=(arr[i]^delta[y]);
		}
		for(int i=x+1;i<y;i++){
			ans+=ans1[i];
		}
	}
	return ans;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
	cin>>n>>m;
	num = sqrt(n);
    for (int i = 1; i <= num; i++)
        st[i] = n / num * (i - 1) + 1, ed[i] = n / num * i;
    ed[num] = n;
    for (int i = 1; i <= num; i++) {
        for (int j = st[i]; j <= ed[i]; j++) {
            belong[j] = i;
        }
    }
	while(m--){
		int l,r,c;
		cin>>c>>l>>r;
		if(c==0) modify(l,r);
		if(c==1){
			cout<<answer(l,r)<<endl;
		}
	}
}
2024/5/23 17:04
加载中...