제출 #1084452

#제출 시각아이디문제언어결과실행 시간메모리
1084452khanhphucscratch카니발 티켓 (IOI20_tickets)C++14
100 / 100
581 ms105888 KiB
#include<bits/stdc++.h>
#include "tickets.h"
#define int long long
using namespace std;
/*void allocate_tickets(vector<vector<int32_t>> s)
{
    int n = s.size(), m = s[0].size();
    for(int i = 0; i < n; i++){
        //for(int j = 0; j < m; j++) cout<<s[i][j]<<" ";
        //cout<<'\n';
    }
}*/
int find_maximum(int32_t k, vector<vector<int32_t>> a)
{
    //Should be ok for k = m
    vector<pair<int, int>> reduce_option;
    int n = a.size(), m = a[0].size(), ans = 0;
    for(int i = 0; i < n; i++){
        for(int j = m-1; j >= m-k; j--) ans += a[i][j];
        for(int j = 0; j < k; j++) reduce_option.push_back(make_pair(a[i][j] + a[i][j+(m-k)], i));
    }
    vector<int> reduce(n), add(n);
    sort(reduce_option.begin(), reduce_option.end());
    for(int i = 0; i < n*k/2; i++){
        ans -= reduce_option[i].first;
        //cout<<"A"<<reduce_option[i].first<<endl;
        reduce[reduce_option[i].second]++;
    }
    for(int i = 0; i < n; i++) add[i] = k-reduce[i];
    vector<vector<int32_t>> s(n);
    for(int i = 0; i < n; i++){
        s[i].resize(m);
        for(int j = 0; j < m; j++) s[i][j] = -1;
    }
    //cout<<"hihi"<<endl;
    for(int it = k-1; it >= 0; it--){
        int reduce_demand = n/2;
        vector<bool> ok(n);
        for(int i = 0; i < n; i++){
            if(add[i] == 0){
                reduce[i]--; reduce_demand--;
                s[i][reduce[i]] = it;
                ok[i] = 1;
            }
            else if(reduce[i] == 0){
                s[i][m-add[i]] = it;
                add[i]--;
                ok[i] = 1;
            }
        }
        for(int i = 0; i < n; i++) if(ok[i] == 0){
            if(reduce_demand > 0 && reduce[i] > 0){
                reduce[i]--; reduce_demand--;
                s[i][reduce[i]] = it;
            }
            else{
                s[i][m-add[i]] = it;
                add[i]--;
            }
        }
    }
    allocate_tickets(s);
    return ans;
}
/*mt19937 rng(13012010);
signed main()
{
    int n, m, k;
    cin>>n>>m>>k;
    vector<vector<int32_t>> a(n);
    for(int i = 0; i < n; i++){
        a[i].resize(m);
        for(int j = 0; j < m; j++) a[i][j] = rng()%1000000001;
        sort(a[i].begin(), a[i].end());
    }
    cout<<find_maximum(k, a);
}*/

#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...