제출 #320363

#제출 시각아이디문제언어결과실행 시간메모리
320363AlexLuchianovHiring (IOI09_hiring)C++14
100 / 100
595 ms20712 KiB
#include <iostream>
#include <vector>
#include <cassert>
#include <algorithm>
#include <cmath>

using ll = long long;
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
#define MAX(a, b) (((a) < (b)) ? (b) : (a))

class FenwickTree{
private:
  std::vector<ll> aib;
  int n;
public:
  FenwickTree(int n_) {
    n = n_;
    aib.resize(1 + n);
  }
  void update(int pos, int val) {
    for(int x = pos; x <= n; x += (x ^ (x & (x - 1))))
      aib[x] += val;
  }
  ll query(int pos) {
    ll result = 0;
    for(int x = pos; 0 < x; x = (x & (x - 1)))
      result += aib[x];
    return result;
  }

  /*
    returns last x such that query(x) <= target
  */
  int lower_than(ll target) {
    int x = 0;
    for(int jump = (1 << 20); 0 < jump; jump /= 2) 
      if(x + jump <= n && aib[x + jump] <= target) {
        target -= aib[x + jump];
        x += jump;
      }
    return x;
  }
};

int const nmax = 500000;

struct Candidate{
  int salary;
  int qualification;
  int id;
  int real;
  bool operator < (Candidate const a) {
    return qualification < a.qualification;
  }
} v[1 + nmax];

bool compare(Candidate a, Candidate b) {
  return 1LL * a.salary * b.qualification < 1LL * b.salary * a.qualification;
}

int main() {
  int n;
  ll budget;
  std::cin >> n >> budget;
  for(int i = 1;i <= n; i++) { 
    std::cin >> v[i].salary >> v[i].qualification;
    v[i].real = i;
  }
  std::sort(v + 1, v + n + 1);
  for(int i = 1;i <= n; i++)
    v[i].id = i;
  std::sort(v + 1, v + n + 1, compare);
  FenwickTree aib(n), aibsum(n);
  
  int result = 0, eval = 0;
  double second_result = 0;

  for(int i = 1;i <= n; i++) {
    int id = v[i].id;
    aib.update(id, 1);
    aibsum.update(id, v[i].qualification);
    int target = aibsum.lower_than(budget * v[i].qualification / v[i].salary);
    int answer = aib.query(target);
    double answer2 = ((double)aibsum.query(target)) * v[i].salary / v[i].qualification;
    if(result < answer) {
      result = answer;
      eval = i;
      second_result = answer2;
    } else if(result == answer && answer2 < second_result) {
      second_result = answer2;
      eval = i;
    }
  }

  std::vector<std::pair<int,int>> sol;
  
  for(int i = 1; i <= eval; i++)
    sol.push_back({v[i].qualification, v[i].real});
  std::sort(sol.begin(), sol.end());
  std::cout << result;
  for(int i = 0; i < result; i++)
    std::cout << '\n' << sol[i].second;

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