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

AcWing 101. 最高的牛

題目連結

問題分析:

差分經典題,我們假設所有的牛都是最高的,通過差分陣列和給定關係進行-1操作,要注意去重,這裡去重有幾種方式,我是選最麻煩的一種233

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 const int N = 1e5+10;
 5 int cow[N],b[N];
 6 multimap<int,int> mp;
 7 int n,p,m,h;//牛數 最高的序號 牛對 高度 
 8 vector<ll> v;
 9 void insert(int
l,int r,int c) 10 { 11 b[l]+=c; b[r+1]-=c; 12 }//multipmap不允許通過下標訪問元素,因為有重複鍵 13 int main() 14 { 15 freopen("inw.txt","r",stdin); 16 freopen("out.txt","w",stdout); 17 scanf("%d%d%d%d",&n,&p,&h,&m); 18 for(int i=0;i<=n;++i) cow[i] = h; 19 for(int i=1;i<=m;i++){
20 int x,y; 21 scanf("%d%d",&x,&y); 22 if(y<x) swap(x,y); 23 auto it = mp.lower_bound(x); 24 auto et = mp.upper_bound(x); 25 if(it!=et){ 26 bool flag = true; 27 for(auto its=it;its!=et;its++){ 28 if(its->second==y) { flag = false
; break; } 29 } 30 if(!flag) continue; 31 } 32 mp.insert(make_pair(x,y)); 33 } 34 for(auto it=mp.begin();it!=mp.end();it++){ 35 // printf("****%d %d****\n",it->first,it->second); 36 if(abs(it->first-it->second)<=1) continue; 37 insert(it->first+1,it->second-1,-1); 38 } 39 for(int i=1;i<=n;i++) cow[i] = b[i]+cow[i-1]; 40 for(int i=1;i<=n;i++) printf("%d\n",cow[i]); 41 return 0; 42 }

關於這道題的知識補充:

  1. multipmap不允許通過鍵訪問元素,並且不能去重(做出來一交WA
  2. pair可直接比較
  3. unordered_set 所有操作都是O(1),而set是O(logN)

這裡補充去重的多種方式

  • set<pair<int,int> > pair可以直接比較大小
  • map<pair<int,int>,bool> 李大佬的方法,本蒟蒻第一次見