tju3140 Switching Lights
数据加强后很经典
#include <iostream>
#include <ctime>
using namespace std;
#define MAXN 100001
int n, m;
int cnt[3*MAXN][2];
struct Node{
int l, r, sum;
}nod[3 * MAXN];
void buildtree(int l, int r, int u){
nod[u].l = l;
nod[u].r = r;
nod[u].sum = 0;
if (l == r){
cnt[u][0] = 1;
return;
}
else{
buildtree(l, (l + r)/2, 2 * u);
buildtree((l + r)/2 + 1, r, 2 * u + 1);
cnt[u][0] = cnt[2*u][0] + cnt[2*u+1][0];
}
}
void add(int l, int r, int u, int s){
if (l <= nod[u].l && nod[u].r <= r){
nod[u].sum++;
return;
}
s += nod[u].sum;
int v = 2 * u;
if (r >= nod[v + 1].l)
add(l, r, v + 1, s);
if (l <= nod[v].r)
add(l, r, v, s);
cnt[u][s & 1] = cnt[v][(s + nod[v].sum) & 1] + cnt[v+1][(s + nod[v+1].sum) & 1];
cnt[u][1 - (s & 1)] = cnt[v][1 - ((s + nod[v].sum) & 1)] + cnt[v+1][1 - ((s + nod[v+1].sum) & 1)];
}
int get(int l, int r, int u, int s){
if (l <= nod[u].l && nod[u].r <= r)
return cnt[u][(nod[u].sum + s) & 1];
s += nod[u].sum;
int ret = 0;
if (l <= nod[2*u].r)
ret += get(l, r, 2*u, s);
if (r >= nod[2*u+1].l)
ret += get(l, r, 2*u+1, s);
return ret;
}
int main(){
int i, order, l, r;
//freopen("C.in", "r", stdin);
//freopen("C.out", "w", stdout);
//int t = clock();
while (scanf("%d %d", &n, &m) != EOF){
memset(cnt, 0, sizeof(cnt));
buildtree(1, n, 1);
for (i = 0; i < m; i++){
scanf("%d %d %d", &order, &l, &r);
if (order == 0)
add(l, r, 1, 0);
else
printf("%d\n", get(l, r, 1, 1));
}
}
//cout << clock() - t << endl;
//system("PAUSE");
return 0;
}
#include <ctime>
using namespace std;
#define MAXN 100001
int n, m;
int cnt[3*MAXN][2];
struct Node{
int l, r, sum;
}nod[3 * MAXN];
void buildtree(int l, int r, int u){
nod[u].l = l;
nod[u].r = r;
nod[u].sum = 0;
if (l == r){
cnt[u][0] = 1;
return;
}
else{
buildtree(l, (l + r)/2, 2 * u);
buildtree((l + r)/2 + 1, r, 2 * u + 1);
cnt[u][0] = cnt[2*u][0] + cnt[2*u+1][0];
}
}
void add(int l, int r, int u, int s){
if (l <= nod[u].l && nod[u].r <= r){
nod[u].sum++;
return;
}
s += nod[u].sum;
int v = 2 * u;
if (r >= nod[v + 1].l)
add(l, r, v + 1, s);
if (l <= nod[v].r)
add(l, r, v, s);
cnt[u][s & 1] = cnt[v][(s + nod[v].sum) & 1] + cnt[v+1][(s + nod[v+1].sum) & 1];
cnt[u][1 - (s & 1)] = cnt[v][1 - ((s + nod[v].sum) & 1)] + cnt[v+1][1 - ((s + nod[v+1].sum) & 1)];
}
int get(int l, int r, int u, int s){
if (l <= nod[u].l && nod[u].r <= r)
return cnt[u][(nod[u].sum + s) & 1];
s += nod[u].sum;
int ret = 0;
if (l <= nod[2*u].r)
ret += get(l, r, 2*u, s);
if (r >= nod[2*u+1].l)
ret += get(l, r, 2*u+1, s);
return ret;
}
int main(){
int i, order, l, r;
//freopen("C.in", "r", stdin);
//freopen("C.out", "w", stdout);
//int t = clock();
while (scanf("%d %d", &n, &m) != EOF){
memset(cnt, 0, sizeof(cnt));
buildtree(1, n, 1);
for (i = 0; i < m; i++){
scanf("%d %d %d", &order, &l, &r);
if (order == 0)
add(l, r, 1, 0);
else
printf("%d\n", get(l, r, 1, 1));
}
}
//cout << clock() - t << endl;
//system("PAUSE");
return 0;
}