This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
#ifndef LOCAL
#include "tickets.h"
#endif
using namespace std;
#define pb push_back
#define ff first
#define ss second
#define sz(a) (int)a.size()
typedef long long ll;
typedef vector<int> vi;
typedef pair<int,int> pii;
const ll inf=1e18;
const int mod=1e9+7;
const int maxn=2e3+5;
int n,m,num[maxn][3],cnt[3];
int us[maxn],t,an,pos,take;
ll ans,sum,jog;
vector<pii> v;
vi b[maxn][3],d;
vector<vector<int>>s;
priority_queue<pii> g[3];
vector<vi> x;
pii c;
#ifdef LOCAL
void allocate_tickets(vector<vi> a){
return;
}
#endif
void f(int tp,int round){
memset(us,0,sizeof(us));
t = 0;
d.clear();
while(!g[tp].empty()){
if(t == n/2) break;
int x=g[tp].top().ss;
g[tp].pop();
us[x] = 1;
num[x][tp]--;
b[x][tp].pb(round);
if(num[x][tp] > 0) d.pb(x);
t++;
}
ans += t;
for(auto i : d) g[tp].push({num[i][tp],i});
if(tp==1) an=0;
else an=1;
for(int i = 0;i < n;i++){
if(us[i] or num[i][an]==0) continue;
num[i][an]--;
b[i][an].pb(round);
}
}
ll ch(int pos,int ind){
v.clear();
sum = 0,take = n/2-1;
for(int i = 0;i < n;i++){
if(i == ind) continue;
if(x[i][m-1] <= pos) sum += pos-x[i][0],take--;
else if(x[i][0] >= pos) sum += x[i][m-1]-pos;
else v.pb({(pos-x[i][0])-(x[i][m-1]-pos),i});
}
sort(v.begin(),v.end());
if(sz(v) < take or take < 0) return -mod;
for(int i = 0;i < take;i++) sum += pos - x[v[i].ss][0];
for(int i = take;i < sz(v);i++) sum += x[v[i].ss][1] - pos;
return sum;
}
void put(int pos,int ind){
v.clear();
take = n/2-1;
for(int i = 0;i < n;i++){
if(i == ind) continue;
if(x[i][m-1] <= pos) take--,s[i][0]=0;
else if(x[i][0] >= pos) s[i][m-1]=0;
else v.pb({(pos-x[i][0])-(x[i][m-1]-pos),i});
}
sort(v.begin(),v.end());
for(int i = 0;i < take;i++) s[v[i].ss][0]=0;
for(int i = take;i < n;i++) s[v[i].ss][m-1]=0;
return;
}
ll find_maximum(int k,vector<vector<int>>_x){
x = _x;
n=sz(x);
m=sz(x[0]);
s.resize(n);
for(int i = 0;i < n;i++) s[i].resize(m);
if(m==1){
for(int i = 0;i < n;i++)
for(int j = 0;j < m;j++) s[i][j] = -1;
for(int i = 0;i < n;i++){
jog = ch(x[i][0],i);
if(ans < jog){
ans = jog;
c = {i,0};
}
jog = ch(x[i][m-1],i);
if(ans < jog){
ans = jog;
c = {i,m-1};
}
}
allocate_tickets(s);
return -1;
put(x[c.ff][c.ss],c.ff);
allocate_tickets(s);
return ans;
}
for(int i = 0;i < n;i++){
for(int j = 0;j < m;j++) num[i][x[i][j]]++;
if(num[i][0]) g[0].push({num[i][0],i});
if(num[i][1]) g[1].push({num[i][1],i});
cnt[0] += num[i][0];
cnt[1] += num[i][1];
}
for(int i = 0;i < k;i++){
if(cnt[0] < cnt[1]) f(0,i);
else f(1,i);
}
for(int i = 0;i < n;i++){
for(int j = 0;j < m;j++){
if(sz(b[i][x[i][j]])){
s[i][j] = b[i][x[i][j]].back();
b[i][x[i][j]].pop_back();
}
else s[i][j] = -1;
}
}
allocate_tickets(s);
return ans;
}
#ifdef LOCAL
int main(){
int n,m,k;
cin >> n >> m >> k;
vector<vi> c;
c.resize(n);
for(int i = 0;i < n;i++){
c[i].resize(m);
for(int j = 0;j < m;j++) cin >> c[i][j];
}
cout<<find_maximum(k,c)<<'\n';
}
#endif
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |