Submission #1006553

#TimeUsernameProblemLanguageResultExecution timeMemory
1006553huutuanHiring (IOI09_hiring)C++14
94 / 100
1470 ms23652 KiB
#include <bits/stdc++.h>

using namespace std;

#define int long long

const int N=5e5+10;
int n, w, s[N], q[N], mq[N], id[N];

int32_t main(){
   auto start=clock();
   ios_base::sync_with_stdio(false);
   cin.tie(nullptr);
   cin >> n >> w;
   for (int i=1; i<=n; ++i){
      cin >> s[i] >> q[i];
      mq[i]=w*q[i]/s[i];
   }
   iota(id, id+n+1, 0);
   sort(id+1, id+n+1, [&](int x, int y){
      return mq[x]>mq[y];
   });
   int ans=0;
   {
      priority_queue<int> pq; int sum=0;
      for (int _i=1; _i<=n; ++_i){
         int i=id[_i];
         pq.push(q[i]); sum+=q[i];
         while (sum>mq[i]){
            sum-=pq.top();
            pq.pop();
         }
         ans=max(ans, (int)pq.size());
      }
   }
   double l=0, r=w;
   while ((clock()-start)*1000/CLOCKS_PER_SEC<=1300){
      double mid=(l+r)/2;
      for (int i=1; i<=n; ++i){
         mq[i]=mid*q[i]/s[i];
      }
      iota(id, id+n+1, 0);
      sort(id+1, id+n+1, [&](int x, int y){
         return mq[x]>mq[y];
      });
      int cur=0;
      {
         priority_queue<int> pq; int sum=0;
         for (int _i=1; _i<=n; ++_i){
            int i=id[_i];
            pq.push(q[i]); sum+=q[i];
            while (sum>mq[i]){
               sum-=pq.top();
               pq.pop();
            }
            cur=max(cur, (int)pq.size());
         }
      }
      if (cur==ans) r=mid;
      else l=mid;
   }
   for (int i=1; i<=n; ++i){
      mq[i]=floor(r*q[i]/s[i]);
   }
   iota(id, id+n+1, 0);
   sort(id+1, id+n+1, [&](int x, int y){
      return mq[x]>mq[y];
   });
   {
      priority_queue<pair<int, int>> pq; int sum=0;
      for (int _i=1; _i<=n; ++_i){
         int i=id[_i];
         pq.emplace(q[i], i); sum+=q[i];
         while (sum>mq[i]){
            sum-=pq.top().first;
            pq.pop();
         }
         if ((int)pq.size()==ans){
            cout << ans << '\n';
            while (pq.size()){
               cout << pq.top().second << '\n';
               pq.pop();
            }
            return 0;
         }
      }
   }
   return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...