有 N 頭牛站成一行,被編隊爲1、2、3…N,每頭牛的身高都爲整數。
當且僅當兩頭牛中間的牛身高都比它們矮時,兩頭牛方可看到對方。
現在,我們只知道其中最高的牛是第 P 頭,它的身高是 H ,剩餘牛的身高未知。
但是,我們還知道這羣牛之中存在着 M 對關係,每對關係都指明瞭某兩頭牛 A 和 B 可以相互看見。
求每頭牛的身高的最大可能值是多少。
輸入格式
第一行輸入整數N,P,H,M數據用空格隔開。
接下來M行,每行輸出兩個整數 A 和 B ,代表牛 A 和牛 B 可以相互看見,數據用空格隔開。
輸出格式
一共輸出 N 行數據,每行輸出一個整數。
第 i 行輸出的整數代表第 i 頭牛可能的最大身高。
數據範圍
1≤N≤10000
1≤H≤1000000
1≤A,B≤10000
0≤M≤10000
輸入樣例:
9 3 5 5
1 3
5 3
4 3
3 7
9 8
輸出樣例:
5
4
5
3
4
4
5
5
5
注意:
- 此題中給出的關係對可能存在重複
。。。我們先將所有的牛的高度都賦值爲最高的高度H,然後對於每對關係,我們將這對關係之間的區間中的每個數減一就好了。注意這一題不會出現區間交叉的情況(會自相矛盾),只會出現嵌套。對於重複的x,y我們可以用map或者set嵌套pair來判斷就好了。
雖然這一題可以通過線段樹來求解但是直接用差分的話時間效率和空間效率上都會更優,而且代碼量也會比較少。
以下是AC代碼:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define IOS ios::sync_with_stdio(false)
const int mac=1e5+10;
const int inf=1e9+10;
int hight[mac];
int main()
{
IOS;
int n,p,h,m;
cin>>n>>p>>h>>m;
hight[0]=h;
set<pair<int,int>>q;
for (int i=1; i<=m; i++){
int x,y;
cin>>x>>y;
if (x>y) swap(x,y);
if (!q.count({x,y})){
q.insert({x,y});
hight[x+1]--;hight[y]++;
}
}
for (int i=1; i<=n; i++){
hight[i]+=hight[i-1];
cout<<hight[i]<<endl;
}
return 0;
}