101.最高的牛
阿新 • • 發佈:2020-12-28
原題連結: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; }