Submission #309164

#TimeUsernameProblemLanguageResultExecution timeMemory
309164knon0501Carnival Tickets (IOI20_tickets)C++14
55 / 100
1262 ms80436 KiB
#include "tickets.h"
#include <vector>
#include <bits/stdc++.h>
using namespace std;
int L[1501];
queue<int> A[1501];
queue<int> B[1501];
int ss[1501];
queue<int> aa[1501];
queue<int> bb[1501];

long long find_maximum(int k, std::vector<std::vector<int>> x) {
	int n = x.size();
	int m = x[0].size();
	std::vector<std::vector<int>> answer(n);
	int i,j;
	for(int i=0 ; i<n ; i++)answer[i].resize(m);
	long long ret=-1;
    if(k==m){
        vector<pair<int,pair<int,int>>> v;
        for(i=0 ; i<n ; i++){
            for(j=0 ; j<m ;j++){
                v.push_back({x[i][j],{i,j}});
            }
        }
        sort(v.begin(),v.end());
        long long ans=0;
        for(i=0 ; i<n*m/2 ; i++){
            aa[v[i].second.first].push(v[i].second.second);
            ans-=v[i].first;
        }
        for(i=n*m/2 ; i<n*m ; i++){
            bb[v[i].second.first].push(v[i].second.second);
            ans+=v[i].first;
        }


        for(j=0 ; j<m ; j++){
            vector<pair<int,int>> vv;
            for(i=0 ; i<n ; i++)vv.push_back({bb[i].size(),i});
            sort(vv.begin(),vv.end());
            for(i=0 ; i<n/2 ; i++){
                answer[vv[i].second][aa[vv[i].second].front()]=j;
                aa[vv[i].second].pop();

            }
            for(i=n/2 ; i<n ; i++){
                answer[vv[i].second][bb[vv[i].second].front()]=j;
                bb[vv[i].second].pop();
            }
        }


        allocate_tickets(answer);
        return ans;
    }
	else if(k>=2){
        long long ans=0;
        int t=0;
        for(i=0 ; i<n ; i++){
            for(j=0 ; j<m ; j++){
                if(x[i][j])A[i].push(j);
                else B[i].push(j);
                answer[i][j]=-1;
                t+=x[i][j];
            }
        }
        for(i=0 ; i<n ; i++){
            for(j=0 ; j<m ;j++){
                if(x[i][j]==1){
                    L[i]=j-1;
                    break;
                }
            }
        }
        int y=m;
        for(i=m-1 ; i>=m-k ; i--){
            int cnt=-(n/2);
            for(j=0 ; j<n ; j++)cnt+=x[j][i];
            int s=0;

            vector<pair<int,int>> v;
            for(j=0 ; j<n ; j++)v.push_back({L[j],j});
            sort(v.rbegin(),v.rend());
            for(auto t: v){
                if(cnt>0 && t.first>=0 && x[t.second][i]){
                    x[t.second][t.first]=1;
                    L[t.second]--;
                    x[t.second][i]=0;
                    cnt--;
                }
            }
            for(j=0 ; j<n ; j++){
                if(x[j][i])s++;
            }
            ss[i]=s;
            if(cnt==0)y=i;

        }
        for(i=m-k ; i<m ; i++){
            for(j=0; j<n ; j++){
                if(ss[i]>(n+1)/2 && x[j][i]==1 && y<m && x[j][y]==0){
                    ss[y]++;
                    x[j][y++]=1;
                    x[j][i]=0;
                    ss[i]--;
                }
            }
            ans+=min(ss[i],n-ss[i]);
        }
        for(i=m-k ; i<m ; i++){
            for(j=0 ; j<n ; j++){
                if(x[j][i]){
                    answer[j][A[j].front()]=m-1-i;
                    A[j].pop();
                }
                else{
                    answer[j][B[j].front()]=m-1-i;
                    B[j].pop();
                }
            }
        }
        allocate_tickets(answer);
        return ans;
	}


	vector<int> aa,bb;
	pair<int,int> cc;
    for(i=0 ; i<n ; i++){
        int y=x[i][0];
        vector<pair<int,int>> a;
        vector<int> b,c;
        long long s=0;
        for(j=0 ; j<n ; j++){
            if(i==j)continue;
            if( x[j][0]>y){
                c.push_back(j);
            }
            else if(x[j][m-1]<y){
                b.push_back(j);
            }
            else{
                a.push_back({y-x[j][0]-(x[j][m-1]-y),j});
            }
        }
        sort(a.rbegin(),a.rend());
        if(c.size()>n/2 || b.size()>n/2)continue;
        for(auto t: a){
            if(b.size()<n/2)b.push_back(t.second);
            else c.push_back(t.second);
        }
        for(auto t: b)s+=y-x[t][0];
        for(auto t: c)s+=x[t][m-1]-y;
        if(s>ret){
            ret=s;
            cc={i,0};
            aa=b;
            bb=c;
        }
    }

    for(i=0 ; i<n ; i++){
        int y=x[i][m-1];
        vector<pair<int,int>> a;
        vector<int> b,c;
        long long s=0;
        for(j=0 ; j<n ; j++){
            if(i==j)continue;
            if( x[j][0]>y){
                c.push_back(j);
            }
            else if( x[j][m-1]<y){
                b.push_back(j);
            }
            else{
                a.push_back({y-x[j][0]-(x[j][m-1]-y),j});
            }
        }
        sort(a.rbegin(),a.rend());
        if(c.size()>n/2 || b.size()>n/2)continue;
        for(auto t: a){
            if(b.size()<n/2)b.push_back(t.second);
            else c.push_back(t.second);
        }
        for(auto t: b)s+=y-x[t][0];
        for(auto t: c)s+=x[t][m-1]-y;
        if(s>ret){
            ret=s;
            cc={i,m-1};
            aa=b;
            bb=c;
        }
    }

    for(i=0 ; i<n ; i++)for(j=0 ; j<m ; j++)answer[i][j]=-1;
    answer[cc.first][cc.second]=0;
    for(auto t: aa)answer[t][0]=0;
    for(auto t: bb)answer[t][m-1]=0;
	allocate_tickets(answer);
	return ret;
}

Compilation message (stderr)

tickets.cpp: In function 'long long int find_maximum(int, std::vector<std::vector<int> >)':
tickets.cpp:148:20: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  148 |         if(c.size()>n/2 || b.size()>n/2)continue;
      |            ~~~~~~~~^~~~
tickets.cpp:148:36: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  148 |         if(c.size()>n/2 || b.size()>n/2)continue;
      |                            ~~~~~~~~^~~~
tickets.cpp:150:24: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  150 |             if(b.size()<n/2)b.push_back(t.second);
      |                ~~~~~~~~^~~~
tickets.cpp:181:20: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  181 |         if(c.size()>n/2 || b.size()>n/2)continue;
      |            ~~~~~~~~^~~~
tickets.cpp:181:36: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  181 |         if(c.size()>n/2 || b.size()>n/2)continue;
      |                            ~~~~~~~~^~~~
tickets.cpp:183:24: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  183 |             if(b.size()<n/2)b.push_back(t.second);
      |                ~~~~~~~~^~~~
#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...