Submission #790994

#TimeUsernameProblemLanguageResultExecution timeMemory
790994alexander707070Carnival Tickets (IOI20_tickets)C++14
12 / 100
3073 ms62404 KiB
#include<bits/stdc++.h>
#include "tickets.h"
#define MAXN 307
using namespace std;

const long long inf=1e15;

int n,m,sol[MAXN],k,rest[MAXN],br,maxs;
long long pref[MAXN][MAXN],suff[MAXN][MAXN];
pair<int,int> s[MAXN][MAXN];
vector<int> curr;
vector< vector<int> > res;

int li[MAXN][MAXN*MAXN],tim,used[MAXN];
long long dp[MAXN][MAXN*MAXN],ans;

long long ff(int pos,int balance){
    if(balance<0)return -inf;
    if(pos==-1 and balance==0)return 0;
    else if(pos==-1)return -inf;

    if(li[pos][balance]==tim)return dp[pos][balance];
    li[pos][balance]=tim;
    dp[pos][balance]=-inf;

    for(int i=0;i<=k;i++){
        dp[pos][balance]=max(dp[pos][balance],ff(pos-1,balance-i)+suff[pos][k-i]-pref[pos][i]);
    }

    return dp[pos][balance];
}

void solve(int pos,int balance){
    if(pos==-1)return;

    for(int i=0;i<=min(k,balance);i++){
        if(ff(pos,balance)==ff(pos-1,balance-i)+suff[pos][k-i]-pref[pos][i]){
            sol[pos]=i; rest[pos]=k-i;
            solve(pos-1,balance-i);
            return;
        }
    }
}

long long find_maximum(int K,vector< vector<int> > x){
    n=int(x.size()); m=int(x[0].size()); k=K;
    res.resize(n);

    for(int i=0;i<n;i++){
        res[i].resize(m);
        for(int f=0;f<m;f++){
            s[i][f]={x[i][f],f};
            res[i][f]=-1;
        }
        sort(s[i],s[i]+m);

        for(int f=0;f<m;f++){
            pref[i][f+1]=s[i][f].first;
            pref[i][f+1]+=pref[i][f];
        }
        for(int f=m-1;f>=0;f--){
            suff[i][m-f]=s[i][f].first;
            suff[i][m-f]+=suff[i][m-f-1];
        }   
    }

    tim++; solve(n-1,(n/2)*k);
    ans=ff(n-1,(n/2)*k);

    for(int i=0;i<k;i++){
        br=n/2; tim++;

        for(int f=0;f<n/2;f++){
            maxs=n;
            for(int w=0;w<n;w++){
                if(sol[w]>sol[maxs] and used[w]!=tim)maxs=w;
            }

            res[maxs][s[maxs][sol[maxs]-1].second]=i;
            sol[maxs]--; used[maxs]=tim;
        }

        for(int f=0;f<n;f++){
            if(used[f]!=tim){
                res[f][s[f][m-rest[f]].second]=i;
                rest[f]--;
            }
        }

        //if(br>0)cout<<1/0;
    }

    allocate_tickets(res);
    return ans;
}


/*
int main(){
    cout<<find_maximum(2, {{0, 2, 5},{1, 1, 3}})<<"\n";
}
*/


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