Submission #1166958

#TimeUsernameProblemLanguageResultExecution timeMemory
1166958julia_08Hiring (IOI09_hiring)C++20
17 / 100
1027 ms131072 KiB
#include <bits/stdc++.h>
using namespace std;

using ll = long long;

const int MAXN = 5e5 + 10;
const int MAXQ = 2e4;

struct worker{
  int s, q, id;

  bool operator < (worker b){
    if((ll) s * b.q != (ll) b.s * q) return (ll) s * b.q < (ll) b.s * q;
    return id < b.id;
  }

};

struct node{
  ll sum; int sum_id;
};

worker a[MAXN];

node seg[4 * MAXQ + 10];

int n; ll w;

void update(int x, int lx, int rx, int i){

  if(rx < i || lx > i) return;

  if(lx == rx){
    seg[x].sum += lx;
    seg[x].sum_id ++;
    return;
  }

  int m = (lx + rx) / 2, lc = 2 * x, rc = 2 * x + 1;

  update(lc, lx, m, i);
  update(rc, m + 1, rx, i);

  seg[x].sum = seg[lc].sum + seg[rc].sum;
  seg[x].sum_id = seg[lc].sum_id + seg[rc].sum_id;
}

node merge(node a, node b){
  return {a.sum + b.sum, a.sum_id + b.sum_id};
}

node query(int x, int lx, int rx, int l, int r){

  if(rx < l || lx > r) return {0, 0};

  if(l <= lx && rx <= r) return seg[x];

  int m = (lx + rx) / 2, lc = 2 * x, rc = 2 * x + 1;

  return merge(query(lc, lx, m, l, r), query(rc, m + 1, rx, l, r));
}

int bs(int x, int lx, int rx, ll val){

  if(lx == rx) return lx;

  int m = (lx + rx) / 2, lc = 2 * x, rc = 2 * x + 1;

  if(seg[lc].sum >= val) return bs(lc, lx, m, val);

  return bs(rc, m + 1, rx, val - seg[lc].sum);
}

int main(){
  cin.tie(0)->sync_with_stdio(0);

  cin >> n >> w;

  for(int i=1; i<=n; i++){
    cin >> a[i].s >> a[i].q;
    a[i].id = i;
  }

  sort(a + 1, a + n + 1);

  ll k = 0;

  for(int i=1; i<=n; i++){

    if(a[i].s > w) continue;

    ll cte = ((w - a[i].s) * a[i].q) / a[i].s;

    int pos = bs(1, 1, MAXQ, cte);

    node x = {0, 0};

    if(pos > 1) x = query(1, 1, MAXQ, 1, pos - 1);

    k = max(k, x.sum_id + ((cte - x.sum) / pos) + 1);

    update(1, 1, MAXQ, a[i].q);

  }

  cout << k << "\n";

  for(int i=1; i<=k; i++) cout << i << "\n";

  /*
  set<pair<int, int>> s;

  ll sum = 0;

  for(int i=1; i<k; i++){
    s.insert({a[i].q, a[i].id});
    sum += a[i].q;
  }

  ll num = 1e18, den = 1;

  int id = k;

  for(int i=k; i<=n; i++){

    ll cur_num = a[i].s * (sum + a[i].q), cur_den = a[i].q;

    if(cur_num * den < num * cur_den){
      num = cur_num, den = cur_den;
      id = i;
    }

    if(a[i].q < (*s.rbegin()).first){
      sum -= (*s.rbegin()).first;
      s.erase(*s.rbegin());

      s.insert({a[i].q, a[i].id});
      sum += a[i].q;
    }

  }

  vector<pair<int, int>> workers;

  for(int i=1; i<id; i++){
    workers.push_back({a[i].q, a[i].id});
  }

  sort(workers.begin(), workers.end());

  cout << k << "\n";

  cout << a[id].id << "\n";

  for(int i=0; i<k-1; i++) cout << workers[i].second << "\n";
  */

  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...