Submission #396628

#TimeUsernameProblemLanguageResultExecution timeMemory
396628peuchHiring (IOI09_hiring)C++17
52 / 100
1022 ms37732 KiB
#include<bits/stdc++.h> using namespace std; const int MAXN = 5e5 + 10; const int MAXQ = 2e4 + 10; int n; double w; double s[MAXN], q[MAXN]; vector<int> ord; double seg[4 * MAXQ]; int cnt[4 * MAXQ]; void update(int pos, int ini, int fim, double id); void query(int pos, int ini, int fim, int p, int q); int bb(int pos, int ini, int fim, double val); bool cmp(int a, int b){ return s[a] * q[b] < s[b] * q[a]; } int main(){ scanf("%d %lf", &n, &w); for(int i = 1; i <= n; i++){ scanf("%lf %lf", &s[i], &q[i]); ord.push_back(i); } sort(ord.begin(), ord.end(), cmp); int ans = 0, id = 0; double qnt = 0; for(int i = 0; i < ord.size(); i++){ int cur = ord[i]; update(1, 1, MAXQ, q[cur]); int k = bb(1, 1, MAXQ, w * q[cur] / s[cur]); query(1, 1, MAXQ, 1, k - 1); int valC = cnt[0]; int valW = seg[0] * s[cur] / q[cur]; if(valC < ans) continue; if(valC > ans) ans = valC, qnt = valW, id = i; if(qnt > valW) ans = valC, qnt = valW, id = i; } printf("%d\n", ans); set<pair<double, int> > aux; for(int i = 0; i <= id; i++) aux.insert(make_pair(q[ord[i]], ord[i])); while(ans--){ printf("%d\n", aux.begin()->second); aux.erase(aux.begin()); } } void update(int pos, int ini, int fim, double id){ if(ini > id || fim < id) return; if(ini == fim){ seg[pos] += id; cnt[pos]++; return; } int mid = (ini + fim) >> 1, e = pos << 1, d = e | 1; update(e, ini, mid, id); update(d, mid + 1, fim, id); seg[pos] = seg[e] + seg[d]; cnt[pos] = cnt[e] + cnt[d]; } int bb(int pos, int ini, int fim, double val){ pair<int, double> ret = make_pair(0, 0); if(ini == fim) return ini; int mid = (ini + fim) >> 1, e = pos << 1, d = e | 1; if(seg[e] > val) return bb(e, ini, mid, val); return bb(d, mid + 1, fim, val - seg[e]); } void query(int pos, int ini, int fim, int p, int q){ cnt[0] = 0; seg[0] = 0; if(ini > q || fim < p) return; if(ini >= p && fim <= q){ seg[0] = seg[pos]; cnt[0] = cnt[pos]; return; } int mid = (ini + fim) >> 1, e = pos << 1, d = e | 1; query(e, ini, mid, p, q); int auxC = cnt[0]; double auxS = seg[0]; query(d, mid + 1, fim, p, q); cnt[0] += auxC; seg[0] += auxS; }

Compilation message (stderr)

hiring.cpp: In function 'int main()':
hiring.cpp:32:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   32 |  for(int i = 0; i < ord.size(); i++){
      |                 ~~^~~~~~~~~~~~
hiring.cpp: In function 'int bb(int, int, int, double)':
hiring.cpp:70:20: warning: variable 'ret' set but not used [-Wunused-but-set-variable]
   70 |  pair<int, double> ret = make_pair(0, 0);
      |                    ^~~
hiring.cpp: In function 'int main()':
hiring.cpp:24:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   24 |  scanf("%d %lf", &n, &w);
      |  ~~~~~^~~~~~~~~~~~~~~~~~
hiring.cpp:26:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   26 |   scanf("%lf %lf", &s[i], &q[i]);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#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...