Submission #1168909

#TimeUsernameProblemLanguageResultExecution timeMemory
1168909SmuggingSpunCarnival Tickets (IOI20_tickets)C++20
11 / 100
3 ms6724 KiB
#include "tickets.h"
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
template<class T>bool minimize(T& a, T b){
    if(a > b){
        a = b;
        return true;
    }
    return false;
}
template<class T>bool maximize(T& a, T b){
    if(a < b){
        a = b;
        return true;
    }
    return false;
}
const int lim = 1505;
const int INF = 2e9;
int n, m, k, a[lim][lim];
namespace sub1{
    ll solve(){
        vector<int>A;
        vector<vector<int>>s(n, vector<int>(m));
        for(int i = 0; i < n; i++){
            A.emplace_back(a[i][0]);
            s[i][0] = 0;
        }
        allocate_tickets(s);
        sort(A.begin(), A.end());
        int median = A[n >> 1];
        ll ans = 0;
        for(int& x : A){
            ans += abs(x - median);
        }
        return ans;
    }
}
namespace sub2{
    ll solve(){
        vector<vector<int>>p(n, vector<int>(2));
        for(int i = 0; i < n; i++){
            if((p[i][0] = min_element(a[i], a[i] + m) - a[i]) == (p[i][1] = max_element(a[i], a[i] + m) - a[i])){
                p[i][0] = 0;
                p[i][1] = 1;
            }
        }
        vector<pair<int, bool>>value;
        for(int i = 0; i < n; i++){
            value.emplace_back(i, false);
            value.emplace_back(i, true);
        }
        sort(value.begin(), value.end(), [&] (auto i, auto j){
            return a[i.first][p[i.first][i.second]] < a[j.first][p[j.first][j.second]];
        });
        vector<pair<int, int>>best;
        ll ans = 0;
        for(int i = 0; i < (n << 1); i++){
            ll sum = -a[value[i].first][p[value[i].first][value[i].second]];
            vector<int>cnt(n, 0);
            vector<bool>use(n, false);
            use[value[i].first] = true;
            vector<pair<int, int>>state;
            for(int j = i - 1; j > -1; j--){
                if(++cnt[value[j].first] == 2){
                    state.emplace_back(value[j].first, p[value[j].first][value[j].second]);
                    sum -= a[value[j].first][p[value[j].first][value[j].second]];
                    use[value[j].first] = true;
                }
            }
            for(int j = 0; j < i && state.size() + 1 < (n >> 1); j++){
                if(!use[value[j].first]){
                    state.emplace_back(value[j].first, p[value[j].first][value[j].second]);
                    sum -= a[value[j].first][p[value[j].first][value[j].second]];
                    use[value[j].first] = true;
                }
            }
            if(state.size() + 1 < (n >> 1)){
                continue;
            }
            for(int j = (n << 1) - 1; j > i && state.size() + 1 < n; j++){
                if(!use[value[j].first]){
                    state.emplace_back(value[j].first, p[value[j].first][value[j].second]);
                    sum += a[value[j].first][p[value[j].first][value[j].second]];
                    use[value[j].first] = true;
                }
            }
            if(state.size() + 1 == n && maximize(ans, sum)){
                state.emplace_back(value[i].first, p[value[i].first][value[i].second]);
                best = state;
            }
        }
        vector<vector<int>>s(n, vector<int>(m, -1));
        for(auto& [i, j] : best){
            s[i][j] = 0;
        }
        allocate_tickets(s);
        return ans;
    }
}
ll find_maximum(int _k, vector<vector<int>>_x){
    n = _x.size();
    m = _x[0].size();
    k = _k;
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            a[i][j] = _x[i][j];
        }
    }
    if(m == 1){
        return sub1::solve();
    }
    if(k == 1){
        return sub2::solve();
    }
}

Compilation message (stderr)

tickets.cpp: In function 'll find_maximum(int, std::vector<std::vector<int> >)':
tickets.cpp:117:1: warning: control reaches end of non-void function [-Wreturn-type]
  117 | }
      | ^
#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...