Submission #430677

#TimeUsernameProblemLanguageResultExecution timeMemory
430677MeGustaElArroz23Carnival Tickets (IOI20_tickets)C++14
41 / 100
850 ms77728 KiB
///////////////// #include "tickets.h" #include<bits/stdc++.h> #define fi first #define se second using namespace std; typedef long long ll; typedef vector<int> vi; typedef vector<vi> vvi; typedef pair<int,int> pii; typedef vector<pii> vii; typedef pair<pii,int> piii; typedef vector<piii> viii; bool casobinario(vvi v){ for (vi w:v){ for (int x:w){ if (x>1) return 0; } } return 1; } vvi res; int INF=2000000000; int minind(int ind,vi v){ int sol=v.size(); v.push_back(INF); for (int i=0;i<v.size()-1;i++){ if (res[ind][i]==-1 and v[i]<v[sol]) sol=i; } return sol; } int maxind(int ind,vi v){ int sol=v.size(); v.push_back(-1); for (int i=0;i<v.size()-1;i++){ if (res[ind][i]==-1 and v[i]>v[sol]) sol=i; } return sol; } bool orden(piii a, piii b){ return a.fi.fi+a.fi.se<b.fi.fi+b.fi.se; } long long find_maximum(int k, std::vector<std::vector<int>> x) { int n = x.size(); int m = x[0].size(); if (m==1){ allocate_tickets(vvi(n,vi(1,0))); vi v; for (int i=0;i<n;i++) v.push_back(x[i][0]); sort(v.begin(),v.end()); ll sol=0; for (int x:v) sol+=abs(v[n/2]-x); return sol; } else if (casobinario(x)){ vvi unos(n); vvi ceros(n); for (int i=0;i<n;i++){ for (int j=0;j<m;j++){ if (x[i][j]) unos[i].push_back(j); else ceros[i].push_back(j); } } set<pii> cantidad; for (int i=0;i<n;i++) cantidad.insert(pii{unos[i].size(),i}); vvi res(n,vi(m,-1)); vvi cadadia(k); for (int dia=0;dia<k;dia++){ auto a=cantidad.begin(); vii restar; for (int i=0;i<n/2;i++){ int ac=(*a).second; if (ceros[ac].size()){ res[ac][ceros[ac][ceros[ac].size()-1]]=dia; ceros[ac].pop_back(); cadadia[dia].push_back(0); } else{ res[ac][unos[ac][unos[ac].size()-1]]=dia; unos[ac].pop_back(); restar.push_back((*a)); cadadia[dia].push_back(1); } a++; } for (int i=0;i<n/2;i++){ int ac=(*a).second; if (unos[ac].size()){ res[ac][unos[ac][unos[ac].size()-1]]=dia; unos[ac].pop_back(); restar.push_back((*a)); cadadia[dia].push_back(1); } else{ res[ac][ceros[ac][ceros[ac].size()-1]]=dia; ceros[ac].pop_back(); cadadia[dia].push_back(0); } a++; } for (pii x:restar){ cantidad.erase(x); cantidad.insert(pii{x.first-1,x.second}); } } allocate_tickets(res); ll sol=0; for (vi v:cadadia){ sort(v.begin(),v.end()); for (int x:v) sol+=abs(v[n/2]-x); } return sol; } else if (k==1){ res=vvi(n,vi(m,-1)); vii indice(n); for (int i=0;i<n;i++) indice[i]=pii{minind(i,x[i]),maxind(i,x[i])}; viii v(n); for (int i=0;i<n;i++) v[i]=piii{pii{x[i][indice[i].first],x[i][indice[i].second]},i}; sort(v.begin(),v.end(),orden); ll sol=-1; vi mejorizq; vi mejorder; for (int i=0;i<n;i++){ vi izq; vi der; int j=0; while (izq.size()<n/2-1 and v[j].se!=i){ if (v[j].fi.fi<=x[i][indice[i].fi]) izq.push_back(v[j].se); else der.push_back(v[j].se); j++; } izq.push_back(v[j].se); j++; while (j<n){ der.push_back(v[j].se); j++; } if (izq.size()<n/2) continue; ll suma=0; int median=x[i][indice[i].fi]; for (int num:izq) suma+=median-x[num][indice[num].fi]; for (int num:der) suma+=x[num][indice[num].se]-median; if (suma>sol){ sol=suma; mejorizq=izq; mejorder=der; } } for (int num:mejorizq) res[num][indice[num].fi]=0; for (int num:mejorder) res[num][indice[num].se]=0; allocate_tickets(res); return sol; } else{ ll realsol=0; res=vvi(n,vi(m,-1)); for (int dia=0;dia<k;dia++){ vii indice(n); for (int i=0;i<n;i++) indice[i]=pii{minind(i,x[i]),maxind(i,x[i])}; viii v(n); for (int i=0;i<n;i++) v[i]=piii{pii{x[i][indice[i].first],x[i][indice[i].second]},i}; sort(v.begin(),v.end(),orden); ll sol=-1; vi mejorizq; vi mejorder; for (int i=0;i<n;i++){ vi izq; vi der; int j=0; while (izq.size()<n/2-1 and v[j].se!=i){ if (v[j].fi.fi<=x[i][indice[i].fi]) izq.push_back(v[j].se); else der.push_back(v[j].se); j++; } izq.push_back(v[j].se); j++; while (j<n){ der.push_back(v[j].se); j++; } if (izq.size()<n/2) continue; ll suma=0; int median=x[i][indice[i].fi]; for (int num:izq) suma+=median-x[num][indice[num].fi]; for (int num:der) suma+=x[num][indice[num].se]-median; if (suma>sol){ sol=suma; mejorizq=izq; mejorder=der; } } for (int num:mejorizq) res[num][indice[num].fi]=dia; for (int num:mejorder) res[num][indice[num].se]=dia; realsol+=sol; } allocate_tickets(res); return realsol; } return 1; }

Compilation message (stderr)

tickets.cpp: In function 'int minind(int, vi)':
tickets.cpp:36:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   36 |     for (int i=0;i<v.size()-1;i++){
      |                  ~^~~~~~~~~~~
tickets.cpp: In function 'int maxind(int, vi)':
tickets.cpp:45:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   45 |     for (int i=0;i<v.size()-1;i++){
      |                  ~^~~~~~~~~~~
tickets.cpp: In function 'long long int find_maximum(int, std::vector<std::vector<int> >)':
tickets.cpp:139:30: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  139 |             while (izq.size()<n/2-1 and v[j].se!=i){
      |                    ~~~~~~~~~~^~~~~~
tickets.cpp:150:27: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  150 |             if (izq.size()<n/2) continue;
      |                 ~~~~~~~~~~^~~~
tickets.cpp:182:34: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  182 |                 while (izq.size()<n/2-1 and v[j].se!=i){
      |                        ~~~~~~~~~~^~~~~~
tickets.cpp:193:31: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  193 |                 if (izq.size()<n/2) continue;
      |                     ~~~~~~~~~~^~~~
#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...