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 "tickets.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int MAXN = 1500;
int N, M, K;
int A[MAXN+10][MAXN+10];
int P[MAXN+10], Q[MAXN+10];
int ans2[MAXN+10][MAXN+10];
ll ans;
int L[MAXN+10], R[MAXN+10], chk[MAXN+10];
ll find_maximum(int _K, vector<vector<int>> _X)
{
N=_X.size(); M=_X[0].size(); K=_K;
for(int i=1; i<=N; i++) for(int j=1; j<=M; j++) A[i][j]=_X[i-1][j-1];
for(int i=1; i<=N; i++) P[i]=0;
vector<pii> V;
for(int i=1; i<=N; i++) for(int j=1; j<=M; j++) V.push_back({A[i][j], i});
sort(V.begin(), V.end());
for(int i=0; i<K*N/2; i++) P[V[i].second]++;
for(int i=N*M-K*N/2; i<N*M; i++) Q[V[i].second]++;
{
priority_queue<pii> PQ1; priority_queue<pii> PQ2;
for(int i=1; i<=N; i++) if(P[i]>1) PQ1.push({A[i][P[i]], i});
for(int i=1; i<=N; i++) if(P[i]==0) PQ2.push({-A[i][1], i});
while(PQ2.size()>N/2)
{
pii now=PQ1.top(); PQ1.pop();
pii now2=PQ2.top(); PQ2.pop();
P[now.second]--;
P[now2.second]++;
if(P[now.second]>1) PQ1.push({A[now.second][P[now.second]], now.second});
}
}
{
priority_queue<pii> PQ1; priority_queue<pii> PQ2;
for(int i=1; i<=N; i++) if(Q[i]>1) PQ1.push({-A[i][M-Q[i]+1], i});
for(int i=1; i<=N; i++) if(Q[i]==0) PQ2.push({A[i][M], i});
while(PQ2.size()>N/2)
{
pii now=PQ1.top(); PQ1.pop();
pii now2=PQ2.top(); PQ2.pop();
Q[now.second]--;
Q[now2.second]++;
if(Q[now.second]>1) PQ1.push({A[now.second][M-Q[now.second]+1], now.second});
}
}
for(int i=1; i<=N; i++) L[i]=1, R[i]=1;
for(int i=1; i<=K; i++)
{
vector<pii> V;
for(int j=1; j<=N; j++) V.push_back({Q[j]-R[j]-P[j]+L[j], j});
sort(V.begin(), V.end());
for(int j=1; j<=N; j++) chk[j]=0;
for(int j=0; j<N/2; j++) chk[V[j].second]=1;
for(int j=1; j<=N; j++)
{
if(!chk[j])
{
ans+=A[j][M-R[j]+1];
ans2[j][M-R[j]+1]=i;
R[j]++;
}
else
{
ans-=A[j][L[j]];
ans2[j][L[j]]=i;
L[j]++;
}
}
}
vector<vector<int>> answer;
answer=vector<vector<int>>(N, vector<int>(M));
for(int i=1; i<=N; i++) for(int j=1; j<=M; j++) answer[i-1][j-1]=ans2[i][j]-1;
allocate_tickets(answer);
return ans;
}
Compilation message (stderr)
tickets.cpp: In function 'll find_maximum(int, std::vector<std::vector<int> >)':
tickets.cpp:37:19: warning: comparison of integer expressions of different signedness: 'std::priority_queue<std::pair<int, int> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
37 | while(PQ2.size()>N/2)
| ~~~~~~~~~~^~~~
tickets.cpp:51:19: warning: comparison of integer expressions of different signedness: 'std::priority_queue<std::pair<int, int> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
51 | while(PQ2.size()>N/2)
| ~~~~~~~~~~^~~~
# | 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... |