제출 #1132157

#제출 시각아이디문제언어결과실행 시간메모리
1132157StefanSebez카니발 티켓 (IOI20_tickets)C++20
14 / 100
664 ms62708 KiB
#include <bits/stdc++.h>
#include "tickets.h"
using namespace std;
#define fi first
#define se second
#define pb push_back
#define ll long long
#define ld long double
const int N=1550;
int a[N][N];
vector<vector<int>>s;
int n,m;
ll izracunaj(vector<int>a){
    sort(a.begin(),a.end());
    //for(auto i:a) printf("%i ",i);printf("\n");
    ll sum1=0;for(auto i:a) sum1+=i;
    ll res=1e18,n=a.size();
    for(ll i=0,sum=0;i<n;i++){
        ll x=sum1-2*sum+a[i]*(2*i-n);
        //printf("%lld\n",x);
        res=min(res,x);
        sum+=a[i];
    }
    return res;
}
ll Izracunaj(){
    int maks=0;
    for(int i=0;i<n;i++) for(int j=0;j<m;j++) maks=max(maks,s[i][j]);
    vector<int>vrednosti[maks+1];
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(s[i][j]!=-1) vrednosti[s[i][j]].pb(a[i][j]);
        }
    }
    ll res=0;for(int i=0;i<=maks;i++) if(!vrednosti[i].empty()) res+=izracunaj(vrednosti[i]);
    return res;
}
long long find_maximum(int k, std::vector<std::vector<int>> a1){
    n=a1.size(),m=a1[0].size();
    for(int i=0;i<n;i++) for(int j=0;j<m;j++) a[i][j]=a1[i][j];
    for(int i=0;i<n;i++){
        vector<int>temp;
        for(int j=0;j<m;j++) temp.pb(-1);
        s.pb(temp);
    }
    /*vector<array<int,3>>nesto;
    for(int i=0;i<n;i++){
        int maks=0,ind=-1;
        for(int j=0;j<m;j++){
            if(a[i][j]>maks) maks=a[i][j],ind=j;
        }
        nesto.pb({maks,i,ind});
    }
    sort(nesto.begin(),nesto.end());
    for(int i=n-1;i>=n/2;i--) s[nesto[i][1]][nesto[i][2]]=0;
    for(int I=0;I<n/2;I++){
        int i=nesto[I][1];
        int mn=1e9,ind=-1;
        for(int j=0;j<m;j++){
            if(mn>a[i][j]) mn=a[i][j],ind=j;
        }
        s[i][ind]=0;
    }
    ll x=Izracunaj();vector<vector<int>>s1=s;
    for(int i=0;i<n;i++) for(int j=0;j<m;j++) s[i][j]=-1;
    nesto.clear();
    for(int i=0;i<n;i++){
        int mn=1e9,ind=-1;
        for(int j=0;j<m;j++){
            if(a[i][j]<mn) mn=a[i][j],ind=j;
        }
        nesto.pb({mn,i,ind});
    }
    sort(nesto.begin(),nesto.end());
    for(int i=0;i<n/2;i++) s[nesto[i][1]][nesto[i][2]]=0;
    for(int I=n/2;I<n;I++){
        int i=nesto[I][1];
        int maks=0,ind=-1;
        for(int j=0;j<m;j++){
            if(maks<a[i][j]) maks=a[i][j],ind=j;
        }
        s[i][ind]=0;
    }
    if(Izracunaj()<x) s=s1;*/
    /*bool izbrisan[n+10]={false};
    while(1){
        int d=0,maks=0,ind0=-1,mn=1e9,ind1=-1;
        pair<int,int>ubaci={-1,-1};
        for(int i=0;i<n;i++){
            if(izbrisan[i]) continue;
            if(a[i][m-1]-mn>d){
                d=a[i][m-1]-mn;
                ubaci={ind1,i};
            }
            if(maks-a[i][0]>d){
                d=maks-a[i][0];
                ubaci={i,ind0};
            }
            if(maks<a[i][m-1]) maks=a[i][m-1],ind0=i;
            if(mn>a[i][0]) mn=a[i][0],ind1=i;
        }
        if(ubaci.fi==-1) break;
        s[ubaci.fi][0]=0;
        s[ubaci.se][m-1]=0;
        izbrisan[ubaci.fi]=izbrisan[ubaci.se]=true;
    }*/
    int num[n+10][2],ind[n+10][2];
    memset(num,0,sizeof(num));
    memset(ind,0,sizeof(ind));
    for(int i=0;i<n;i++) ind[i][0]=0,ind[i][1]=m-1;
    for(int i=0;i<n;i++) for(int j=0;j<m;j++) num[i][a[i][j]]++;
    set<pair<int,int>>st[2];
    for(int i=0;i<n;i++) st[0].insert({num[i][0],i}),st[1].insert({num[i][1],i});
    for(int c=0;c<k;c++){
        int ct=n;bool was[n+10]={false};
        while(ct){
            if(st[0].size()&&st[1].size()){
                pair<int,int>x=*st[1].rbegin();st[1].erase(x);
                while(was[x.se]) x=*st[1].rbegin(),st[1].erase(x);
                num[x.se][1]--;
                s[x.se][ind[x.se][1]--]=c;
                was[x.se]=true;

                x=*st[0].rbegin();st[0].erase(x);
                while(was[x.se]) x=*st[0].rbegin(),st[0].erase(x);
                num[x.se][0]--;
                s[x.se][ind[x.se][0]++]=c;
                was[x.se]=true;
                ct-=2;
            }
            else if(st[0].empty()){
                pair<int,int>x=*st[1].rbegin();st[1].erase(x);
                while(was[x.se]) x=*st[1].rbegin(),st[1].erase(x);
                num[x.se][1]--;
                s[x.se][ind[x.se][1]--]=c;
                was[x.se]=true;
                ct--;
            }
            else{
                pair<int,int>x=*st[0].rbegin();st[0].erase(x);
                while(was[x.se]) x=*st[0].rbegin(),st[0].erase(x);
                num[x.se][0]--;
                s[x.se][ind[x.se][0]++]=c;
                was[x.se]=true;
                ct--;
            }
        }
        st[0].clear(),st[1].clear();
        for(int i=0;i<n;i++) st[0].insert({num[i][0],i}),st[1].insert({num[i][1],i});
    }
    allocate_tickets(s);
    return Izracunaj();
}
#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...