http://icpc.upc.edu.cn/problem.php?cid=1430&pid=6
差分序列是个好东西啊。。。。很多地方都用了啊,,,
线性的进行区间操作orz
有题可知
h[a+1]~a[b-1]都是比h[a]和h[b]小,那么最佳方案就是将次区间的所有高度-1,那么我们就将整个区间-1
也就是sum[a+1]--, sum[b]++
而条件h[a]>=h[b]我还不明觉厉啊。。。。。
(脑补:假设一般情况下h[a]==h[b]的,而却有c使得(a, c), pos[c]>pos[b],那么这样b显然比a和c低,这样h[a]==h[b]的情况就打破了,也就是我们按照交换过来后的差分是成立的)
#include <map>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
map<pair<int, int>, bool> v;
int s[10000030],n,p,ans,h,t;
int main() {
scanf("%d%d%d%d",&n,&p,&h,&t);
while (t--) {
int a, b;
scanf("%d%d", &a, &b);
if (a > b) swap(a, b);
if (v[make_pair(a, b)]) continue;
s[a+1]--;
s[b]++;
v[make_pair(a, b)] = 1;
}
for (int i = 1; i <= n; i++) {
ans += s[i];
printf("%d\n", h + ans);
}
}