题目链接
http://poj.org/problem?id=3263
分析
差分,初始数组中元素均为 000,对于每个 (A,B)(A, B)(A,B),将 A+1A + 1A+1 位置 −1- 1−1,将 BBB 位置 +1+ 1+1,表示区间 [A+1,B−1][A + 1, B - 1][A+1,B−1] 每个位置均 −1- 1−1,差分数组中最终每个位置的前缀和 +H+ H+H 即为答案,注意可能有重复的 (A,B)(A, B)(A,B)
AC代码
#include <cstdio>
#include <iostream>
#include <map>
using namespace std;
inline int read() {
int num = 0;
char c = getchar();
while (c < '0' || c > '9') c = getchar();
while (c >= '0' && c <= '9')
num = num * 10 + c - '0', c = getchar();
return num;
}
const int maxn = 1e4 + 5;
int n, r, a[maxn];
map<pair<int, int>, bool> vis;
int main() {
n = read(), read(), a[0] = read(), r = read();
for (int i = 1; i <= r; ++i) {
int x = read(), y = read();
if (x > y) swap(x, y);
if (vis[make_pair(x, y)]) continue;
vis[make_pair(x, y)] = 1;
--a[x + 1], ++a[y];
}
for (int i = 1; i <= n; ++i) {
a[i] += a[i - 1];
printf("%d\n", a[i]);
}
return 0;
}