제출 #576675

#제출 시각아이디문제언어결과실행 시간메모리
576675MadokaMagicaFan카니발 티켓 (IOI20_tickets)C++14
100 / 100
1263 ms154452 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using vi = vector<int>; using vll = vector<ll>; using pi = pair<int,int>; const ll inf = 1e10; #define all(v) v.begin(),v.end() #define sort(v) sort(all(v)) #define endl '\n' #define forn(i,n) for(int i = 0; i < n; ++i) #define forbe(i,b,e) for(int i = b; i < e; ++i) #define forr(i,n) for(int i = n-1; i >= 0; --i) #define sz(v) ((int)v.size()) #define pb push_back #define f first #define s second //#define ONTST const int N = 1505; const int M = 1505; void allocate_tickets(vector<vi>s); using pl = pair<ll,int>; ll subtaskidk(int k, vector<vi> &x) { int n = sz(x); int m = sz(x[0]); vector<vi> s(n); vector<pair<ll,int>> vals; forn(i,n) s[i].assign(m,-1); vector<vector<pair<ll,int>>> sval(n); int topp[N]; int botp[N]; forn(i,n) { forn(j,m) { sval[i].pb({x[i][j], j}); } sort(sval[i]); } bitset<N*M> c; bitset<N*M> z; forn(i,n) { if (i < (n>>1)) { topp[i] = m-1; botp[i] = k; } else { topp[i] = m-1-k; botp[i] = 0; } } priority_queue<pl> q1; priority_queue<pl, vector<pl>, greater<pl>> q2; forn(i,n) { if (botp[i]) q1.push({sval[i][ botp[i]-1 ].f + sval[i][ topp[i] ].f, i}); else q1.push({-inf,i}); if (topp[i]<m-1) q2.push({sval[i][ botp[i] ].f + sval[i][ topp[i]+1 ].f, i}); else q2.push({inf,i}); } while (sz(q1)) { auto u1 = q1.top(); auto u2 = q2.top(); if (u1.f <= u2.f) break; --botp[u1.s]; --topp[u1.s]; ++botp[u2.s]; ++topp[u2.s]; q1.pop(); q2.pop(); int i = u1.s; if (botp[i]) q1.push({sval[i][ botp[i]-1 ].f + sval[i][ topp[i] ].f, i}); else q1.push({-inf,i}); if (topp[i]<m-1) q2.push({sval[i][ botp[i] ].f + sval[i][ topp[i]+1 ].f, i}); else q2.push({inf,i}); i = u2.s; if (botp[i]) q1.push({sval[i][ botp[i]-1 ].f + sval[i][ topp[i] ].f, i}); else q1.push({-inf,i}); if (topp[i]<m-1) q2.push({sval[i][ botp[i] ].f + sval[i][ topp[i]+1 ].f, i}); else q2.push({inf,i}); } // ll minval, maxval; // int mnp, mxp; // while (1) { // mnp = mxp = -1; // minval = inf; // maxval = -inf; // forn(i, n) { // if (botp[i]) { // if (maxval < sval[i][ botp[i]-1 ].f + sval[i][ topp[i] ].f) { // maxval = sval[i][ botp[i]-1 ].f + sval[i][ topp[i] ].f; // mxp = i; // } // } // if (topp[i]<m-1) { // if (minval > sval[i][ botp[i] ].f + sval[i][ topp[i]+1 ].f) { // minval = sval[i][ botp[i] ].f + sval[i][ topp[i]+1 ].f; // mnp = i; // } // } // } // // if (minval >= maxval) // break; // --botp[mxp]; // --topp[mxp]; // ++topp[mnp]; // ++botp[mnp]; // } ll ans = 0; forn(i ,n) { for(int j = m-1; j > topp[i]; --j) c[ i*m + sval[i][j].s ] = 1; for(int j = m-1; j > topp[i]; --j) ans += sval[i][j].f; for(int j = 0; j < botp[i]; ++j) z[ i*m + sval[i][j].s ] = 1; for(int j = 0; j < botp[i]; ++j) ans -= sval[i][j].f; } forn(i,n) { forn(j,m) { if (c[ i*m + j ]) { vals.pb({x[i][j] * 2 + 1,i * m + j}); } else { vals.pb({x[i][j] * 2,i * m + j}); } } } sort(vals); forn(i,n) { topp[i] = m-1; botp[i] = 0; } bitset<N> up; bitset<N> us; int cnt; int ucnt; int u = 0; int str = 0; int ind; queue<int> b[N]; queue<int> t[N]; #ifdef ONTST forn(j,m) { forn(i,n) { cout << c[i*m+j] << ' '; } cout << endl; } forn(j,m) { forn(i,n) { cout << z[i*m+j] << ' '; } cout << endl; } #endif int bcnt = 0; int rcnt = 0; while (u < k) { cnt = 0; ucnt = 0; rcnt = 0; forn(i,n) { up[i] = 0; us[i] = 0; if (sz(t[i])) { up[i] = 1; us[i] = 1; ++cnt; ++ucnt; } else if (sz(b[i])) { us[i] = 1; ++cnt; } } while (cnt < n || ucnt < (n>>1)) { // assert(str < sz(vals)); ind = vals[str].s; ++str; // printf("std(%d), i(%d), j(%d), v(%d), c(%d), z(%d)\n", str, ind/m, ind%m, vals[str].f, (int)c[ind], (int)z[ind]); if (c[ ind ]) { t[ind/m].push(ind); // assert(bcnt == ((n*k)>>1)); if (!up[ind/m]) ++ucnt; up[ind/m] = 1; if (!us[ind/m]) { us[ind/m] = 1; ++cnt; } } if (z[ ind ]) { ++bcnt; b[ind/m].push(ind); if (!us[ind/m]) { us[ind/m] = 1; ++cnt; } } } forn(i,n) { // assert(rcnt <= (n>>1)); if (up[i] && (sz(b[i]) == 0)) { // printf("Day %d: i(%d), j(%d), top\n", u, i, t[i].front()%m); s[i][t[i].front()%m] = u; t[i].pop(); ++rcnt; us[i] = 0; } } forn(i,n) { if (!us[i]) continue; if (up[i] && rcnt < (n>>1)) { // printf("Day %d: i(%d), j(%d), top\n", u, i, t[i].front()%m); s[i][t[i].front()%m] = u; t[i].pop(); ++rcnt; } else { // printf("Day %d: i(%d), j(%d), bot\n", u, i, b[i].front()%m); s[i][b[i].front()%m] = u; b[i].pop(); } } // assert(rcnt == (n>>1)); ++u; } allocate_tickets(s); return ans; } ll find_maximum(int k, vector<vi>x) { int n = sz(x); int m = sz(x[0]); // if (m == 1) return subtask1(k,x); // if (k == 1) return subtask2(k,x); // if (m == k) return subtask4(k,x); return subtaskidk(k,x); } #ifdef ONPC void allocate_tickets(vector<vi>s) { forn(i, sz(s)) { forn(j, sz(s[0])) { cout << s[i][j] << ' '; } cout << endl; } } void solve() { int n, m, k; cin >> n >> m >> k; vector<vi> x(n); forn(i,n) { x[i].assign(m,0); } forn(j,m) { forn(i,n) { cin >> x[i][j]; } } cout << find_maximum(k, x) << endl; } int main() { freopen("input", "r", stdin); // ios_base::sync_with_stdio(0);cin.tie(0); solve(); } #endif

컴파일 시 표준 에러 (stderr) 메시지

tickets.cpp: In function 'll find_maximum(int, std::vector<std::vector<int> >)':
tickets.cpp:258:9: warning: unused variable 'n' [-Wunused-variable]
  258 |     int n = sz(x);
      |         ^
tickets.cpp:259:9: warning: unused variable 'm' [-Wunused-variable]
  259 |     int m = sz(x[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...