1. 程式人生 > 實用技巧 >101.最高的牛

101.最高的牛

原題連結:101. 最高的牛


解題思路

差分+區間處理小操作

這道題目的一個核心要點,就是如何處理這些特殊的關係,也就是兩頭牛能互相看見。

其實題目中已經告訴我們如何處理,因為我們發現,題目中要求牛的身高最高,那麼既然如此,我們完全可以將每一組關係(A,B),看作[A+1,B-1]這組牛身高比A,B這兩頭牛矮1.

各位可以畫一個圖,來更好理解這道題目

因此我們可以利用區間處理小操作,也就是字首和加差分。設一個數組為D,D[i]為比最高牛矮多少,則D[P]=0,那麼對於一組關係,我們可以這樣操作,D[A+1]-,D[B]++;然後從左往右字首和,就可以求出矮多少。具體可以看程式碼實現。

本題資料內部可能重複,要判重,還有[l,r]不一定l<r

樣例程式碼

#include<bits/stdc++.h>
using namespace std;
map<pair<int,int>,bool>existed;
int c[10010],d[10010];
int main()
{
    int n,p,h,m;
    cin>>n>>p>>h>>m;
    for(int i=1;i<=m;i++)
    {
        int a,b;
        cin>>a>>b;
        if(a>b)
            swap(a,b);
        if(existed[make_pair(a,b)])
            continue;
        d[a+1]--;
        d[b]++;
        existed[make_pair(a,b)]=true;
    }
    for(int i=1;i<=n;i++)
    {
        c[i]=c[i-1]+d[i];
        cout<<h+c[i]<<endl;
    }
    return 0;
}