제출 #1253327

#제출 시각아이디문제언어결과실행 시간메모리
1253327nvc2k8선물 (IOI25_souvenirs)C++20
100 / 100
12 ms420 KiB
#include <bits/stdc++.h> #define TASK "sourvenirs" #include "souvenirs.h" #define endl '\n' #define mp make_pair #define pb push_back #define fi first #define se second #define BIT(i,x) (((i)>>(x))&1) #define FOR(i,a,b) for(int i = (a); i<=(b); i++) #define FORD(i,a,b) for(int i = (a); i>=(b); i--) #define all(C) C.begin(), C.end() using namespace std; using ll = long long; using pii = pair<int,int>; const int INT_LIM = 2147483647; const ll LL_LIM = 9223372036854775807; template <typename X> bool minimize(X &x, const X &y) {if (x>y){x = y; return true;}return false;} template <typename X> bool maximize(X &x, const X &y) {if (x<y){x = y; return true;}return false;} ///------------------------------------------/// struct equation{ bitset<100> c; ll sum = 0; equation() {} equation(pair<vector<int>,ll> x, ll X) { for (auto i:x.fi) c[i] = 1; sum = X-x.se; } }; ll a[105]; int t[105], n; vector<equation> f; bool check() { FOR(i, 1, n-1) if (!a[i]) return true; return false; } bool cmp(const equation &x, const equation &y) { int cx = n, cy = n; FOR(i, 1, n-1) if (x.c[i]) { cx = i; break; } FOR(i, 1, n-1) if (y.c[i]) { cy = i; break; } return cx<cy; } void process(int pos) { FOR(i, 1, n-1) if (f[pos].c[i] && a[i]>0) { f[pos].c[i] = 0; f[pos].sum -= a[i]; } while (f[pos].c.count()>0) { if (f[pos].c.count()==1) { int id = 0; FOR(i, 1, n-1) if (f[pos].c[i]) { id = i; break; } a[id] = f[pos].sum; int cnt = 0; FOR(i, id+1, n-1) if (!a[i]) cnt++; if (cnt>0) { f.pb(equation(transaction(a[id]-1),a[id]-1)); FOR(i, 1, n-1) if (f.back().c[i]) t[i]++; process((int)f.size()-1); } } else { ll nx = f[pos].sum/f[pos].c.count(); f.pb(equation(transaction(nx), nx)); FOR(i, 1, n-1) if (f.back().c[i]) t[i]++; process((int)f.size()-1); } FOR(i, 1, n-1) if (f[pos].c[i] && a[i]>0) { f[pos].c[i] = 0; f[pos].sum -= a[i]; } } } void buy_souvenirs(int N, long long P0) { n = N; a[0] = P0; f.pb(equation(transaction(P0-1), P0-1)); FOR(i, 1, n-1) if (f[0].c[i]) t[i]++; process(0); FOR(i, 1, n-1) { FOR(j, t[i]+1, i) transaction(a[i]); } return; }
#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...