#include "tickets.h"
#include <vector>
#include <bits/stdc++.h>
//#include "grader.cpp"
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
typedef pair<int,int> pii;
const ll INF=1e18;
ll ans=0;
int n,m;
vector<vector<int>> sol,v;
bool comp(pll a, pll b)
{
return a.second>b.second;
}
int S,D,mns,pls;
ll cap[2005][2005],nodes,dist[2005],from[2005],l[2005],r[2005],real_d[2005],old_d[2005];
vector<ll> muchii[2005];
bool use[2005];
int flow;
ll k;
void bellman()
{
for(int i=0;i<=nodes;i++)
{
dist[i]=INF;
old_d[i]=INF;
from[i]=-1;
}
old_d[S]=0;
queue<int> coada;
coada.push(S);
while(!coada.empty())
{
ll nod=coada.front();
coada.pop();
for(int i:muchii[nod])
if(cap[nod][i]>0)
{
ll cost=0;
if(nod==mns)
{
if(i>=0&&i<n)
cost=-v[i][m-(k-cap[nod][i])-1];
}
if(nod==pls)
{
if(i>=0&&i<n)
cost=v[i][k-cap[nod][i]];
}
if(nod>=0&&nod<n)
{
if(i==mns)
cost=v[nod][m-cap[nod][i]];
if(i==pls)
cost=-v[nod][cap[nod][i]-1];
}
if(old_d[i]>old_d[nod]+cost)
{
old_d[i]=old_d[nod]+cost;
from[i]=nod;
coada.push(i);
}
}
}
}
bool flux()
{
for(int i=0;i<=nodes;i++)
{
dist[i]=INF;
real_d[i]=INF;
from[i]=-1;
use[i]=0;
}
dist[S]=0;
real_d[S]=0;
priority_queue<pii,vector<pii>, greater<pii>> coada;
coada.push({0,S});
while(!coada.empty())
{
int nod=coada.top().second;
coada.pop();
if(use[nod])
continue;
use[nod]=1;
for(int i:muchii[nod])
if(cap[nod][i]>0)
{
ll cost=0;
if(nod==mns)
{
if(i>=0&&i<n)
cost=-v[i][m-(k-cap[nod][i])-1];
}
if(nod==pls)
{
if(i>=0&&i<n)
cost=v[i][k-cap[nod][i]];
}
if(nod>=0&&nod<n)
{
if(i==mns)
cost=v[nod][m-cap[nod][i]];
if(i==pls)
cost=-v[nod][cap[nod][i]-1];
}
if(dist[i]>dist[nod]+cost+old_d[nod]-old_d[i])
{
dist[i]=dist[nod]+cost+old_d[nod]-old_d[i];
real_d[i]=real_d[nod]+cost;
from[i]=nod;
coada.push({dist[i],i});
}
}
}
for(int i=0;i<=nodes;i++)
old_d[i]=real_d[i];
if(real_d[D]==INF)
return 0;
flow++;
ans+=real_d[D];
//cout<<flow<<' '<<ans<<'\n';
for(int i=D;i!=S;i=from[i])
{
cap[from[i]][i]--;
cap[i][from[i]]++;
}
return 1;
}
bool byplus(int a,int b)
{
return cap[a][pls]>cap[b][pls];
}
long long find_maximum(int K, std::vector<std::vector<int>> vectoras)
{
k=K;
n = vectoras.size();
m = vectoras[0].size();
sol=vectoras;
v=vectoras;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
sol[i][j]=-1;
S=n;
D=n+1;
pls=n+2;
mns=n+3;
nodes=n+3;
muchii[S].push_back(pls);
muchii[pls].push_back(S);
muchii[S].push_back(mns);
muchii[mns].push_back(S);
cap[S][pls]=k*n/2;
cap[S][mns]=k*n/2;
for(int i=0;i<n;i++)
{
muchii[pls].push_back(i);
muchii[i].push_back(pls);
cap[pls][i]=k;
muchii[mns].push_back(i);
muchii[i].push_back(mns);
cap[mns][i]=k;
muchii[i].push_back(D);
muchii[D].push_back(i);
cap[i][D]=k;
}
bellman();
while(flux());
ans=-ans;
for(int i=0;i<n;i++)
{
l[i]=0;
r[i]=m-1;
}
for(int i=0;i<n;i++)
swap(cap[i][pls],cap[i][mns]);
for(int pas=0;pas<k;pas++)
{
vector<int> linii;
for(int i=0;i<n;i++)
linii.push_back(i);
sort(linii.begin(),linii.end(),byplus);
for(int z=0;z<n;z++)
{
int i=linii[z];
if(z<n/2)
{
assert(cap[i][pls]>0);
cap[i][pls]--;
sol[i][r[i]]=pas;
r[i]--;
}
else
{
assert(cap[i][mns]>0);
cap[i][mns]--;
sol[i][l[i]]=pas;
l[i]++;
}
}
}
allocate_tickets(sol);
return ans;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
2396 KB |
Output is correct |
2 |
Correct |
1 ms |
2396 KB |
Output is correct |
3 |
Correct |
1 ms |
2396 KB |
Output is correct |
4 |
Correct |
2 ms |
2396 KB |
Output is correct |
5 |
Correct |
14 ms |
6792 KB |
Output is correct |
6 |
Correct |
382 ms |
25692 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
2396 KB |
Output is correct |
2 |
Correct |
1 ms |
2548 KB |
Output is correct |
3 |
Correct |
1 ms |
2396 KB |
Output is correct |
4 |
Correct |
4 ms |
2644 KB |
Output is correct |
5 |
Correct |
30 ms |
9812 KB |
Output is correct |
6 |
Correct |
790 ms |
101516 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
2396 KB |
Output is correct |
2 |
Correct |
1 ms |
2544 KB |
Output is correct |
3 |
Correct |
1 ms |
2392 KB |
Output is correct |
4 |
Correct |
18 ms |
2656 KB |
Output is correct |
5 |
Correct |
981 ms |
9108 KB |
Output is correct |
6 |
Execution timed out |
3019 ms |
65112 KB |
Time limit exceeded |
7 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
2392 KB |
Output is correct |
2 |
Correct |
1 ms |
2396 KB |
Output is correct |
3 |
Correct |
1 ms |
2396 KB |
Output is correct |
4 |
Correct |
67 ms |
2736 KB |
Output is correct |
5 |
Execution timed out |
3016 ms |
8792 KB |
Time limit exceeded |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
2396 KB |
Output is correct |
2 |
Correct |
3 ms |
2648 KB |
Output is correct |
3 |
Correct |
8 ms |
2652 KB |
Output is correct |
4 |
Correct |
19 ms |
2612 KB |
Output is correct |
5 |
Correct |
35 ms |
2648 KB |
Output is correct |
6 |
Correct |
52 ms |
2648 KB |
Output is correct |
7 |
Correct |
2 ms |
2392 KB |
Output is correct |
8 |
Correct |
9 ms |
2396 KB |
Output is correct |
9 |
Correct |
50 ms |
2704 KB |
Output is correct |
10 |
Correct |
43 ms |
2652 KB |
Output is correct |
11 |
Correct |
68 ms |
2652 KB |
Output is correct |
12 |
Correct |
58 ms |
2720 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
2396 KB |
Output is correct |
2 |
Correct |
3 ms |
2648 KB |
Output is correct |
3 |
Correct |
8 ms |
2652 KB |
Output is correct |
4 |
Correct |
19 ms |
2612 KB |
Output is correct |
5 |
Correct |
35 ms |
2648 KB |
Output is correct |
6 |
Correct |
52 ms |
2648 KB |
Output is correct |
7 |
Correct |
2 ms |
2392 KB |
Output is correct |
8 |
Correct |
9 ms |
2396 KB |
Output is correct |
9 |
Correct |
50 ms |
2704 KB |
Output is correct |
10 |
Correct |
43 ms |
2652 KB |
Output is correct |
11 |
Correct |
68 ms |
2652 KB |
Output is correct |
12 |
Correct |
58 ms |
2720 KB |
Output is correct |
13 |
Correct |
63 ms |
9812 KB |
Output is correct |
14 |
Correct |
178 ms |
9812 KB |
Output is correct |
15 |
Correct |
2292 ms |
10012 KB |
Output is correct |
16 |
Execution timed out |
3063 ms |
8796 KB |
Time limit exceeded |
17 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
2396 KB |
Output is correct |
2 |
Correct |
1 ms |
2396 KB |
Output is correct |
3 |
Correct |
1 ms |
2396 KB |
Output is correct |
4 |
Correct |
2 ms |
2396 KB |
Output is correct |
5 |
Correct |
14 ms |
6792 KB |
Output is correct |
6 |
Correct |
382 ms |
25692 KB |
Output is correct |
7 |
Correct |
1 ms |
2396 KB |
Output is correct |
8 |
Correct |
1 ms |
2548 KB |
Output is correct |
9 |
Correct |
1 ms |
2396 KB |
Output is correct |
10 |
Correct |
4 ms |
2644 KB |
Output is correct |
11 |
Correct |
30 ms |
9812 KB |
Output is correct |
12 |
Correct |
790 ms |
101516 KB |
Output is correct |
13 |
Correct |
1 ms |
2396 KB |
Output is correct |
14 |
Correct |
1 ms |
2544 KB |
Output is correct |
15 |
Correct |
1 ms |
2392 KB |
Output is correct |
16 |
Correct |
18 ms |
2656 KB |
Output is correct |
17 |
Correct |
981 ms |
9108 KB |
Output is correct |
18 |
Execution timed out |
3019 ms |
65112 KB |
Time limit exceeded |
19 |
Halted |
0 ms |
0 KB |
- |