[LeetCode題解]40. 組合總和 II
阿新 • • 發佈:2020-09-10
[https://www.acwing.com/problem/content/103/]
首先,題目給了m對關係 (i,j),表示i和k可以互相看見。那麼,這m對關係不能有交叉,只可以重疊。
一開始n頭牛都是最高的,給了一對關係 (i,j),那麼i和j之間的牛的高度都減去1。所以題目就是維護一個序列,支援區間減法就可以了,可以用差分。
#include <iostream> #include <cstring> #include <cstdio> #include <vector> #include <algorithm> #include <map> using namespace std; const int N = 1e5 + 100; int n, P, H, m; int b[N]; map<pair<int, int>, bool > mp; int main() { scanf("%d%d%d%d", &n, &P, &H, &m); for(int i = 1; i <= m; i ++ ) { int l, r; scanf("%d%d", &l, &r); if(l > r) swap(l, r); l ++, r --; if( mp[make_pair(l, r)]) continue; mp[make_pair(l, r)] = true; b[l] --, b[r + 1] ++; } for(int i = 1; i <= n; i ++) { b[i] += b[i - 1]; printf("%d\n", H + b[i]); } return 0; }