Advertisement
DarkTXYZ

PROG-1119: รัฐบาลผสม (coalition)

May 3rd, 2019
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.91 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. long long cnt[300005],qs[300005];
  6. long long n;
  7. vector<pair<long long,long long> > plist;
  8.  
  9. int main(){
  10.     scanf("%lld",&n);
  11.     long long sum = 0;
  12.     for(long long i=1;i<=n;i++){
  13.         long long party;
  14.         scanf("%lld",&party);
  15.         plist.push_back({party,i});
  16.         sum += party;
  17.     }
  18.     sum /= 2;
  19.     sort(plist.begin(), plist.end());
  20.     for(long long i=n;i>=1;i--){
  21.         qs[i] = plist[i-1].first;
  22.         qs[i] += qs[i+1];
  23.     }
  24.     long long cn = 1;
  25.     for(auto c : plist){
  26.         long long l = 1,r = n;
  27.         long long num = c.first;
  28.         long long ans = 0;
  29.         while(l <= r){
  30.             long long m = (l+r)/2;
  31.             long long s = num + qs[m];
  32.             if(m <= cn)
  33.                 s -= num;
  34.             if(s > sum){
  35.                 ans = max(m,ans);
  36.                 l = m+1;
  37.             }
  38.             else
  39.                 r = m-1;
  40.         }
  41.         if(ans <= cn)
  42.             cnt[c.second] = n-ans;
  43.         else
  44.             cnt[c.second] = n-ans+1;
  45.         cn++;
  46.     }
  47.     for(long long i=1;i<=n;i++)
  48.         printf("%lld\n",cnt[i]);
  49. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement