제출 #300326

#제출 시각아이디문제언어결과실행 시간메모리
300326guangxuan카니발 티켓 (IOI20_tickets)C++14
55 / 100
1484 ms75284 KiB
#include "tickets.h" #include <bits/stdc++.h> using namespace std; long long find_maximum(int k, std::vector<std::vector<int>> x) { int n = x.size(); int m = x[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] = x[i][j]; } } nth_element(all_x,all_x+n*m/2,all_x+n*m); int med = all_x[n*m/2]; 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 st = -1e9, en =1e9; while(st<en){ int mi = st+(en-st)/2; int pos=0,neg=0; for(int i=0;i<n;i++){ int l = 0, r = m-1; for(int iter=0;iter<k;iter++){ int lv = x[i][l], rv = x[i][r]; lv=mi+abs(lv); rv=abs(rv); if(lv>rv && x[i][l]<=0){ neg++; l++; } else{ pos++; r--; } } } if(neg<n*k/2)st = mi+1; else en = mi; } long long ans = 0; int mi = st; int pos=0,neg=0; int storel[n],storer[n]; for(int i=0;i<n;i++){ int l = 0, r = m-1; for(int iter=0;iter<k;iter++){ int lv = x[i][l], rv = x[i][r]; lv=mi+abs(lv); rv=abs(rv); if(lv>rv && x[i][l]<=0){ ans+=abs(x[i][l]); neg++; l++; } else{ ans+=abs(x[i][r]); pos++; r--; } } storel[i]=l; storer[i]=r; } //printf("pne: %d %d\n",pos,neg); //printf("mi: %d \n",mi); vector<int> low[n], high[n]; for(int i=0;i<n;i++){ while((storel[i]!=0) && neg>n*k/2){ int l = storel[i]-1, r = storer[i]; int lv = x[i][l], rv = x[i][r]; lv=mi+abs(lv); rv=abs(rv); if(x[i][r]<0||lv-1!=rv)break; pos++;neg--; ans-=abs(x[i][l]);ans+=abs(x[i][r]); storel[i]--;storer[i]--; } for(int j=0;j<storel[i];j++){ low[i].push_back(j); } for(int j=m-1;j>storer[i];j--){ high[i].push_back(j); } } 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",storel[i],storer[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(); } } } allocate_tickets(answer); return ans; }
#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...