Submission #411580

#TimeUsernameProblemLanguageResultExecution timeMemory
411580wiwihoNaan (JOI19_naan)C++14
29 / 100
434 ms10484 KiB
#include <bits/stdc++.h> #include <bits/extc++.h> #define StarBurstStream ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); #define iter(a) a.begin(), a.end() #define riter(a) a.rbegin(), a.rend() #define lsort(a) sort(iter(a)) #define gsort(a) sort(riter(a)) #define pb(a) push_back(a) #define eb(a) emplace_back(a) #define pf(a) push_front(a) #define ef(a) emplace_front(a) #define pob pop_back() #define pof pop_front() #define mp(a, b) make_pair(a, b) #define F first #define S second #define mt make_tuple #define gt(t, i) get<i>(t) #define tomax(a, b) ((a) = max((a), (b))) #define tomin(a, b) ((a) = min((a), (b))) #define topos(a) ((a) = (((a) % MOD + MOD) % MOD)) #define uni(a) a.resize(unique(iter(a)) - a.begin()) #define printv(a, b) {bool pvaspace=false; \ for(auto pva : a){ \ if(pvaspace) b << " "; pvaspace=true;\ b << pva;\ }\ b << "\n";} using namespace std; using namespace __gnu_pbds; typedef long long ll; typedef unsigned long long ull; typedef long double ld; using pii = pair<int, int>; using pll = pair<ll, ll>; using pdd = pair<ld, ld>; using tiii = tuple<int, int, int>; const ll MOD = 1000000007; const ll MAX = 2147483647; template<typename A, typename B> ostream& operator<<(ostream& o, pair<A, B> p){ return o << '(' << p.F << ',' << p.S << ')'; } ll ifloor(ll a, ll b){ if(b < 0) a *= -1, b *= -1; if(a < 0) return (a - b + 1) / b; else return a / b; } ll iceil(ll a, ll b){ if(b < 0) a *= -1, b *= -1; if(a > 0) return (a + b - 1) / b; else return a / b; } struct frac{ ll a, b; frac(ll a = 0, ll b = 1): a(a), b(b) { sim(); } void sim(){ if(b < 0) a = -a, b = -b; // cerr << "sim " << a << " " << b << " "; ll g = __gcd(a, b); a /= g; b /= g; // cerr << a << " " << b << "\n"; } }; frac operator-(frac a){ return frac(-a.a, a.b); } frac operator+(frac a, frac b){ ll g = __gcd(a.b, b.b); return frac(a.a * b.b / g + b.a * a.b / g, a.b * b.b / g); } frac operator-(frac a, frac b){ return a + (-b); } frac operator*(frac a, frac b){ return frac(a.a * b.a, a.b * b.b); } bool operator<(frac a, frac b){ return a.a * b.b < a.b * b.a; } ostream& operator<<(ostream& o, frac a){ return o << mp(a.a, a.b); } int main(){ StarBurstStream int n, l; cin >> n >> l; vector<vector<ll>> v(n + 1, vector<ll>(l + 1)); vector<vector<ll>> sum(n + 1, vector<ll>(l + 1)); vector<int> rp(n + 1); for(int i = 1; i <= n; i++){ for(int j = 1; j <= l; j++){ cin >> v[i][j]; sum[i][j] = sum[i][j - 1] + v[i][j]; } } vector<frac> x(n + 1); vector<int> p(n + 1); int now = 1; frac r = 1; for(int i = 1; i <= n; i++){ frac mn = l + 1; int mnp = -1; for(int j = 1; j <= n; j++){ if(rp[j] == -1) continue; rp[j] = max(now, rp[j]); frac ok = v[j][now] * r; while(ok + (sum[j][rp[j]] - sum[j][now]) < frac(sum[j][l], n)){ rp[j]++; } frac qq = ok + (sum[j][rp[j]] - sum[j][now]) - frac(sum[j][l], n); frac tmp = rp[j] - (qq * frac(1, v[j][rp[j]])); // cerr << i << " " << j << " " << tmp << " " << mn << " " << now << " " << rp[j] << " " << qq << " " << ok + (sum[j][rp[j]] - sum[j][now]) << " " << frac(sum[j][l], n) << "\n"; if(tmp < mn){ mn = tmp; mnp = j; } } x[i] = mn; p[i] = mnp; now = rp[mnp]; r = now - mn; rp[mnp] = -1; } for(int i = 1; i < n; i++){ cout << x[i].a << " " << x[i].b << "\n"; } for(int i = 1; i <= n; i++){ cout << p[i] << " "; } cout << "\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...