Submission #300493

#TimeUsernameProblemLanguageResultExecution timeMemory
300493guangxuanCarnival Tickets (IOI20_tickets)C++14
76 / 100
3055 ms65736 KiB
#include "tickets.h" #include <bits/stdc++.h> using namespace std; long long find_maximum(int k, std::vector<std::vector<int>> x2) { int n = x2.size(); int m = x2[0].size(); int all_x[n*m]; for (int i = 0; i < n; i++) { for(int j=0;j<m;j++){ all_x[i*m+j] = x2[i][j]; } } sort(all_x,all_x+n*m); long long bans=0; vector<vector<int> > banswer; for(int mi=max(n*m/2-10,0);mi<min(n*m/2+10,n*m);mi++){ vector<vector<int>> x = x2; int med = all_x[mi]; cerr << med << endl; for (int i = 0; i < n; i++) { for(int j=0;j<m;j++){ x[i][j] -= med; //printf("%d ",x[i][j]); }//puts(""); } int l[n],r[n]; int neg = 0; priority_queue<pair<int,int> >pq; for(int i=0;i<n;i++){ l[i]=k;r[i]=m-1; for(int j=0;j<k;j++){ if(x[i][j]>0){ l[i]=j;r[i]=m-1-(k-j); break; } } //cerr<<l[i] << ' ' << r[i] << endl; if(l[i]&&x[i][r[i]]>=0){ pq.push({x[i][r[i]]-abs(x[i][l[i]-1]),i}); } neg+=l[i]; } bool legit = 1; while(neg>n*k/2){ if(!pq.size()){legit=0;break;} pair<int,int> ctop = pq.top();pq.pop(); int i= ctop.second; neg--; l[i]--;r[i]--; if(l[i]&&x[i][r[i]]>=0){ pq.push({x[i][r[i]]-abs(x[i][l[i]-1]),i}); } } if(!legit||neg!=n*k/2)continue; long long ans = 0; vector<int> low[n], high[n]; for(int i=0;i<n;i++){ //cerr<<l[i] << ' ' << r[i] << endl; for(int j=0;j<l[i];j++){ ans+=abs(x[i][j]); low[i].push_back(j); if(x[i][j]>0){legit=0;break;} } for(int j=m-1;j>r[i];j--){ ans+=abs(x[i][j]); high[i].push_back(j); if(x[i][j]<0){legit=0;break;} } } if(!legit)continue; std::vector<std::vector<int>> answer(n,vector<int>(m,-1)); pair<int,int> diff2id[n]; /*for(int i=0;i<n;i++){ printf("%d %d\n",l[i],r[i]); printf("lo: "); for(int j:low[i])printf("%d ",j); printf("high: "); for(int j:high[i])printf("%d ",j); puts(""); }*/ for(int r=0;r<k;r++){ for(int i=0;i<n;i++)diff2id[i] = make_pair(high[i].size()-low[i].size(),i); sort(diff2id,diff2id+n); for(int i=0;i<n;i++){ if(i<n/2){ int x = diff2id[i].second; answer[x][low[x].back()] = r; low[x].pop_back(); } else{ int x = diff2id[i].second; answer[x][high[x].back()] = r; high[x].pop_back(); } } } if(ans>bans){ bans=ans; banswer=answer; } } allocate_tickets(banswer); return bans; }
#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...