小蒟蒻只会分块,10分
查看原帖
小蒟蒻只会分块,10分
226148
Suuon_Kanderu楼主2020/5/8 21:26

看来是某个sb错误,但我看不出来啊啊啊啊。马蜂凑活看吧

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int N = 2e5 + 10;
struct node{
    int val,rank;
}a[N];
int data,cnt;	
int n,m;
string s;
#define val(i) a[i].val
#define tag(i) tag[i]
#define rank(i) a[i].rank
int L[N],R[N],sum[N],tag[N]; 
void push(int i) {
	if(val(i) == 1)val(i) = 0;
	else val(i) = 1;
	int k = val(i) xor (tag[rank(i)]&1);
	if(k == 1)sum[rank(i)]++;
	else sum[rank(i)]--;
}
int find(int i) {
	int k = val(i) xor (tag[rank(i)]&1);
	return k;
}
void change(int l,int r) {
	for(int i = l; i <= R[rank(l)]; i++)push(i);
	if(rank(l) != rank(r))
		for(int i = r; i >= L[rank(r)]; i--)push(i);
	for(int i = rank(l)+1; i <= rank(r)-1; i++) {
		sum[i] = abs(sum[i] - data);
		tag[i] = tag[i]^1;
	}
}
int qsum(int l,int r) {
	int ans = 0;
	for(int i = l; i <= R[rank(l)]; i++) 
		ans += find(i);
	if(rank(l) != rank(r))
		for(int i = r; i >= L[rank(r)]; i--)
			ans += find(i);
			
	for(int i = rank(l)+1; i <= rank(r)-1; i++)
		ans += sum[i]; 
	return ans;
}
void test() {
	cout << "-----------------------" << "\n";
	printf("\tid\tnum\trank\t\n");
	for(int i = 1;i <= n;i++)
		printf("\t%d:\t%d\t%d\n",i,val(i) xor tag(rank(i)),rank(i));
	printf("\tid\tsum\ttag\n");
	for(int i = 1; i <= cnt; i++) 
		printf("\t%d:\t%d\t%d\n",i,sum[i],tag[i]);		
	cout <<"\n"<< "-----------------------" << "\n";
}
void inii() {
	cin >> n >> m >> s;
	data = sqrt(n),cnt = n/data+1;
	if(n % data == 0)cnt--;
	for(int i = 0; i < n; i++) {	
		int j = i+1;
		rank(j) = (j-1)/data+1;
		if(s[i] == '1') {
			val(j) = 1;
			sum[rank(j)]++;
		}
	}
	L[1] = 1; R[1] = L[1] + data -1;
	for(int i = 2; i <= cnt; i++) {
		L[i] = R[i-1]+1;
		R[i] = min(L[i]+data-1,n);
	}	
}
void work() {
	while(m--) {
		int l,r,op;
		scanf("%d",&op);
		scanf("%d%d",&l,&r);
		if(op == 0)change(l,r);
		else cout << qsum(l,r) << "\n";
//test();
	}	
}
int main() {
	inii();
/*	for(int i = 1; i <= cnt; i++) {
		cout << L[i] << " " << R[i] << " " ;
	}
	cout << endl;*/
	work();
    return 0;
}
2020/5/8 21:26
加载中...