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;
}
posted @ 2020-12-31 10:43  Withinlover  阅读(72)  评论(0编辑  收藏  举报