最高的牛 (差分+前綴和)

題目描述

有 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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章