題目描述
有 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
注意:
此題中給出的關係對可能存在重複
思路:這道題意思就是先給你一個最高的牛的身高,然後再給出幾組牛,兩兩能
相互看到,AB兩兩能相互看到就是指中間的牛的身高都比這兩個牛的身高低,我
們相求每個牛的最大身高,那麼中間的牛的身高我們就看做比AB矮1,因此我們
可以可以利用區間處理小操作,也就是前綴和加差分。設一個數組D,D[i]
爲比 最高牛矮多少,則D[P]=0,那麼對於一組關係,我們可以這樣操作,
D[A+1]--,D[B]++;然後從左到右前綴和,就可以求出矮多少。具體可以看代碼實
現。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
map<pair<ll,ll>,ll> q;
ll n,m,i,j,k,p,h,c[10100],d[10100];
int main()
{
cin>>n>>p>>h>>m;
for (i=1;i<=m;i++)
{
ll A,B;
cin>>A>>B;
if (A>B)
swap(A,B);
if (!q[make_pair(A,B)])//沒重複出現的詢問
{
q[make_pair(A,B)]=1;//第一次出現,標記爲1
d[A+1]--,d[B]++;
}
}
for (i=1;i<=n;i++)
c[i]=c[i-1]+d[i];
for (i=1;i<=n;i++)
cout<<c[i]+h<<endl;
}