제출 #576197

#제출 시각아이디문제언어결과실행 시간메모리
576197MadokaMagicaFan카니발 티켓 (IOI20_tickets)C++14
41 / 100
957 ms131956 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>;

#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

const int N = 1505;
const int M = 1505;

void allocate_tickets(vector<vi>s);

ll subtask1(int k, vector<vi> &x) {
    int n = sz(x);
    int m = sz(x[0]);
    vector<vi> s(n);
    forn(i,n) s[i].assign(m,0);

    vi ans;

    forn(i,n) {
        ans.pb(x[i][0]);
    }

    sort(ans);
    
    ll rans = 0;

    forn(i,n) {
        if (i < (n>>1))
            rans -= ans[i];
        else
            rans += ans[i];
    }

    forn(i,n) {
        s[i][0] = 0;
    }

    allocate_tickets(s);

    return rans;
}

ll subtask4(int k, vector<vi> &x) {
    int n = sz(x);
    int m = sz(x[0]);
    vector<vi> s(n);
    forn(i,n) s[i].assign(m,0);
    vector<pair<ll,int>> vals;
    vector<vector<pair<ll,int>>> sval(n);

    int topp[N];
    int botp[N];

    forn(i,n) {
        topp[i] = m-1;
        botp[i] = 0;
        forn(j,m) {
            sval[i].pb({x[i][j], j});
            vals.pb({x[i][j],i * m + j});
        }
        sort(sval[i]);
    }

    ll ans = 0;
    sort(vals);
    bitset<N*M> c;
    bitset<N*M> mid;

    int midval = vals[((n*m)>>1)].f;
    forn(i,n*m) {
        ans -= (ll)vals[i].f;
        if (vals[i].f == midval)
            mid[vals[i].s] = 1;
        if (i < ((n*m)>>1)) continue;
        c[vals[i].s] = 1;
        ans += (ll)vals[i].f;
        ans += (ll)vals[i].f;
    }

//    forn(i,m) {
//        forn(j, n) {
//            cout << c[ j*m + sval[j][m-i-1].s ] << ' ';
//        }
//        cout << endl;
//    }

    bitset<N> up;
    int cnt;
    forn(j, k) {
        forn(i,n) up[i] = 0;
        cnt = 0;
        forn(i,n) {
            if (cnt == (n>>1))
                break;
            if (c[ i*m + sval[i][topp[i]].s ] == 0 || 
                c[ i*m + sval[i][botp[i]].s ] == 0) continue;
            ++cnt;
//            cout << "Sel " << i << endl;
            up[i]=1;
        }

        forn(i,n) {
            if (cnt == (n>>1))
                break;
            if (up[i]) continue;
            if (c[ i*m + sval[i][topp[i]].s ] == 0 || 
                mid[ i*m + sval[i][botp[i]].s ] == 0) continue;
            ++cnt;
            up[i]=1;
        }

        forn(i,n) {
            if (cnt == (n>>1))
                break;
            if (up[i]) continue;
            if (c[ i*m + sval[i][topp[i]].s ] == 0) continue;
            ++cnt;
            up[i]=1;
        }

        forn(i,n) {
            if (cnt == (n>>1))
                break;
            if (up[i]) continue;
            if (mid[ i*m + sval[i][topp[i]].s ] == 0 || 
                c[ i*m + sval[i][botp[i]].s ] == 0) continue;
            ++cnt;
            up[i]=1;
        }

        forn(i,n) {
            if (cnt == (n>>1))
                break;
            if (up[i]) continue;
            if (mid[ i*m + sval[i][topp[i]].s ] == 0 || 
                mid[ i*m + sval[i][botp[i]].s ] == 0) continue;
            ++cnt;
            up[i]=1;
        }

        forn(i,n) {
            if (cnt == (n>>1))
                break;
            if (up[i]) continue;
            if (mid[ i*m + sval[i][topp[i]].s ] == 0) continue;
            ++cnt;
            up[i]=1;
        }

//        cout << cnt << endl;
//        forn(i,n) {
//            cout << topp[i] << ' ';
//        }
//        cout << endl;
//        forn(i,n) {
//            cout << botp[i] << ' ';
//        }
//        cout << endl;
        assert(cnt == (n>>1));

        forn(i,n) {
            if (up[i]) {
                s[i][ sval[i][topp[i]].s ] = j;
                --topp[i];
            } else {
                s[i][ sval[i][botp[i]].s ] = j;
                ++botp[i];
            }
        }
    }

    allocate_tickets(s);

    return ans;
}

ll subtask2(int k, vector<vi> &x) {
    int n = sz(x);
    int m = sz(x[0]);
    vector<vi> s(n);
    forn(i,n) s[i].assign(m,-1);
    vi minval(n);
    vi maxval(n);

    bitset<N> c;

    vector<pair<ll,int>> vs;
    forn(i,n) {
        ll mv = 1e9+2;
        ll mx = -1;
        forn(j, m) {
            if (mv > x[i][j]) {
                minval[i] = j;
                mv = x[i][j];
            }
            if (mx < x[i][j]) {
                maxval[i] = j;
                mx = x[i][j];
            }
        }
        vs.pb({mx+mv,i});
    }

    sort(vs);

    ll ans = 0;
    forn(u,n) {
        int i = vs[u].s;
        if (u < (n>>1)) {
            ans -= (ll)x[i][minval[i]];
            s[i][minval[i]] = 0;
        } else {
            ans += (ll)x[i][maxval[i]];
            s[i][maxval[i]] = 0;
        }
    }
    allocate_tickets(s);

    return ans;
}

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) {
        topp[i] = m-1;
        botp[i] = 0;
        forn(j,m) {
            sval[i].pb({x[i][j], j});
            vals.pb({x[i][j],i * m + j});
        }
        sort(sval[i]);
    }
    sort(vals);
    bitset<N*M> c;
    bitset<N*M> mid;
    ll ans = 0;

    int midval = vals[((n*m)>>1)].f;
    forn(i,n*m) {
        if (vals[i].f == midval) mid[vals[i].s] = 1;
        if (i < ((n*m)>>1)) continue;
        c[vals[i].s] = 1;
    }

    vector<pair<ll,int>> vs;
    ll prest;
    forn(u, k) {
        vs.clear();
        forn(i, n) {
            prest = 0;
            if (c[ i*m + sval[i][topp[i]].s ] == 1) {
                prest = 3;
            }
            if (c[ i*m + sval[i][topp[i]].s ] == 1 ||
                mid[ i*m + sval[i][topp[i]].s ] == 1) {
                ++prest;
                if (c[ i*m + sval[i][botp[i]].s ] == 1) prest += 3;
                else if (mid[ i*m + sval[i][botp[i]].s ] == 1) prest += 2;
            }

            vs.pb({ ((sval[i][topp[i]].f +
                      sval[i][botp[i]].f)<<3) + prest,
                      i
                      });
        }

        sort(vs);

        forn(j,n) {
            int i = vs[j].s;
            if (j < (n>>1)) {
                ans -= sval[i][botp[i]].f;
                s[i][ sval[i][botp[i]].s ] = u;
                ++botp[i];
            } else {
                ans += sval[i][topp[i]].f;
                s[i][ sval[i][topp[i]].s ] = u;
                --topp[i];
            }
        }
    }

    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("in", "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:314:9: warning: unused variable 'n' [-Wunused-variable]
  314 |     int n = sz(x);
      |         ^
#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...