2020 算法上机赛 C1 - C 小田田浇花
题面
有 \(n\) 朵花,编号\(0∼n−1\),一开始都是干旱状态。
每次操作会都使 \([L,R]\) 区间内的花朵状态发生改变,也就是说,对于花 \(i\) ,$ L≤i≤R$ ,如果 \(i\) 是干旱状态,则小田田会浇水让花变成正常状态,而如果 \(i\) 是正常状态,会由于天气原因变为干旱状态。
请问 \(k\) 次操作后有多少花是正常状态。
输入
多组输入数据
每组数据第一行两个数 \(n,k\)(\(1≤n≤10^9,1≤k≤10^5\))
接下来 \(k\) 行,每行两个数 \(l,r\)(\(0≤l≤r≤n−1\))
输出
每组数据一行一个数,表示最后正常状态的花的个数
输入样例
10 1
2 6
输出样例
5
Hint
排序+思维
做法
区间修改 \(\to\) 后缀和修改
可以发现一次 \([L, R]\) 的操作,相当于进行了一次 \([L, n]\) + \([R + 1, n]\)
答案是所有被浇了奇数次的花
经过上述的转换后,我们只要按照左端点排个序就可以统计答案了
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <algorithm>
using namespace std;
inline int read() {
int q=0,w=1;char c=getchar();
while(!isdigit(c)){if(c=='-')w=-1;c=getchar();}
while(isdigit(c))q=q*10+c-'0',c=getchar();
return w*q;
}
typedef long long ll;
#define N 200010
int n, k, A[N];
int ans, cnt;
int main() {
while(scanf("%d%d", &n, &k) != EOF) {
cnt = ans = 0;
for(int i = 1;i <= k; ++i) {
A[++cnt] = read();
A[++cnt] = read() + 1;
}
sort(A + 1, A + 1 + cnt);
for(int i = 2;i <= 2 * k; i += 2)
ans += A[i] - A[i - 1];
printf("%d\n", ans);
}
return 0;
}