Submission #1255178

#TimeUsernameProblemLanguageResultExecution timeMemory
1255178madamadam3Festival (IOI25_festival)C++20
24 / 100
88 ms9408 KiB
#include "festival.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; using vi = vector<int>; using vvi = vector<vi>; using vl = vector<ll>; using vvl = vector<vl>; using pi = pair<int, int>; #define FOR(i, a, b) for (int i = a; i < b; i++) #define ROF(i, a, b) for (int i = a; i >= b; i--) #define each(a, x) for (auto &a : x) #define all(x) (x).begin(), (x).end() #define bg(x) (x).begin() #define en(x) (x).end() #define rev(x) reverse(all(x)) #define sz(x) int((x).size()) #define srt(x) sort(all(x)) #define cnt(a, x) count(all(x), a) #define trace(x) each(a, (x)) cout << a << " " #define mp make_pair #define pb push_back #define lb lower_bound #define ub upper_bound struct DSU { int n; vi par, siz; DSU() {}; DSU(int N) { n = N; par.resize(n); siz.assign(n, 1); iota(all(par), 0); } int find(int v) { if (par[v] == v) return v; return par[v] = find(par[v]); } void unite(int a, int b) { a = find(a); b = find(b); if (a != b) { if (siz[a] < siz[b]) swap(a, b); par[b] = a; siz[a] += siz[b]; } } }; const ll INF = 1e18; int n; vl p, t; ll after(ll money, int idx) { if (idx < 0 || idx >= n) return -1e17; if (money - p[idx] < 0) return -1e17; ll v = (money - p[idx]) * t[idx]; if (v > INF) v = INF; return v; } void info(int idx) { if (idx < 0 || idx >= n) return; cout << "P[" << idx << "]: " << p[idx] << " T[" << idx << "]: " << t[idx] << "\n"; } vi max_coupons(int A, vi P, vi T) { n = sz(P); p = vl(all(P)), t = vl(all(T)); ll money = A; vi indices(n); iota(all(indices), 0); sort(all(indices), [&](int a, int b) {return P[a] < P[b];}); deque<int> t1, t2; FOR(i, 0, n) (T[indices[i]] == 1 ? t1 : t2).pb(indices[i]); auto f = [&](int n2) { ll start = A; int ans = 0; FOR(i, 0, n2) { int idx = t2[i]; ll nx = after(start, idx); if (nx < 0) return -1; ans++; start = nx; } FOR(i, 0, sz(t1)) { int idx = t1[i]; ll nx = after(start, idx); if (nx < 0) return ans; ans++; start = nx; } return ans; }; int lo = 0, hi = sz(t2); while (lo < hi) { int mid = lo + (hi - lo) / 2; int a1 = f(mid), a2 = f(mid+1); if (a1 < a2) { lo = mid+1; } else { hi = mid; } } // int lo = -1, pr = 0; // FOR(i, 0, sz(t2)) { // int xa = f(i); // cout << xa << "\n"; // if (xa > pr) lo = i, pr = xa; // } vi ans; // FOR(i, 0, n) { // int i1 = t1.empty() ? -1 : t1.front(), i2 = t2.empty() ? -1 : t2.front(); // ll a1 = after(money, i1), a2 = after(money, i2); // if (a1 < 0 && a2 < 0) break; // if (a1 >= a2) { // cout << "1\n"; // t1.pop_front(); // money = a1; // ans.pb(i1); // } else { // cout << "2\n"; // t2.pop_front(); // money = a2; // ans.pb(i2); // } // cout << money << "\n"; // if (money > INF) money = INF; // } // cout << "using " << lo << " t2 coupons.\n"; FOR(i, 0, lo) { int idx = t2[i]; ans.pb(idx); money = after(money, idx); } FOR(i, 0, sz(t1)) { int idx = t1[i]; ll nx = after(money, idx); if (nx < 0) break; ans.pb(idx); money = nx; } return ans; }
#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...