题目描述:
你是一只地鼠,最喜欢在人类所谓的打地鼠游戏中戏弄愚蠢的人类。你纵横天下数十年,仍无人能打爆你的头,因而被称为当代的头铁王。
秉承着敌进我退、敌退我扰的策略,你总结出自己的一套作死策略:偶冒奇不冒,即你只会从一个已经被敲打过偶数次的地洞的冒头。
打地鼠游戏:N个线性排列的地洞,人类手持铁锤,每一次造成L到R洞口的范围攻击。你只允许在愚蠢的人类攻击的同时冒头,不然怎么对的上头铁王的称号。
输入:
一个文件仅有一组数据。
数据第一行2个整数N、M (0<N,M≤100000)(0<N,M \leq 100000)(0<N,M≤100000),分别代表N个地洞。
接下来M行,每行两个整数L,R (0<L≤R≤100000)(0< L \leq R \leq100000)(0<L≤R≤100000),表示当前攻击的范围
输出:
M行数据,每行输出当前可以冒头的地洞个数
5 4 1 1 3 4 1 5 2 3
4 2 0 2
题目描述:
你是一只地鼠,最喜欢在人类所谓的打地鼠游戏中戏弄愚蠢的人类。你纵横天下数十年,仍无人能打爆你的头,因而被称为当代的头铁王。
秉承着敌进我退、敌退我扰的策略,你总结出自己的一套作死策略:偶冒奇不冒,即你只会从一个已经被敲打过偶数次的地洞的冒头。
打地鼠游戏:N个线性排列的地洞,人类手持铁锤,每一次造成L到R洞口的范围攻击。你只允许在愚蠢的人类攻击的同时冒头,不然怎么对的上头铁王的称号。
输入:
一个文件仅有一组数据。
数据第一行2个整数N、M (0<N,M≤100000)(0<N,M \leq 100000)(0<N,M≤100000),分别代表N个地洞。
接下来M行,每行两个整数L,R (0<L≤R≤100000)(0< L \leq R \leq100000)(0<L≤R≤100000),表示当前攻击的范围
输出:
M行数据,每行输出当前可以冒头的地洞个数
#include <iostream>
using namespace std;
typedef long long LL;
const int N = 1e5 + 5;
int T, Case;
int n, m;
int rev[N*4];
int sum[N*4];
#define root 1,n,1
#define lson l,m,o<<1
#define rson m+1,r,o<<1|1
#define pushUp(o) sum[o] = sum[o<<1] + sum[o<<1|1]
void pushDown(int o, int len) {
if(rev[o] == 0) return;
int l = o<<1, r = o<<1|1;
rev[l] ^= 1;
rev[r] ^= 1;
rev[o] = 0;
sum[l] = len - (len>>1) - sum[l];
sum[r] = (len>>1) - sum[r];
}
void modify(int L, int R, int l, int r, int o) {
if(L <= l && R >= r) {
rev[o] ^= 1;
sum[o] = (r-l+1) - sum[o];
return;
}
pushDown(o, r-l+1);
int m = (l + r) >> 1;
if(L <= m) modify(L, R, lson);
if(R > m) modify(L, R, rson);
pushUp(o);
}
int query(int L, int R, int l, int r, int o) {
if(L > R) return 0;
if(L <= l && R >= r) {
return sum[o];
}
pushDown(o, r-l+1);
int m = (l + r) >> 1, ret = 0;
if(L <= m) ret += query(L, R, lson);
if(R > m) ret += query(L, R, rson);
return ret;
}
int main() {
scanf("%d%d", &n, &m);
while(m--) {
int l, r;
scanf("%d%d", &l, &r);
modify(l, r, root);
int ans = query(1, l-1, root) + query(r+1, n, root);
ans = n - (r-l+1) - ans;
printf("%d\n", ans);
}
return 0;
}