# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1235922 | stanirina | 카니발 티켓 (IOI20_tickets) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
#define int long long
#include "tickets.h"
using namespace std;
/*
void allocate_tickets(vector<vector<int>> ans){
int n=ans.size();
int m=ans[0].size();
for(int i=0;i<n;i++){
for(int j=0;j<m;j++)cout<<ans[i][j]<<' ';
cout<<endl;
}
}
*/
long long find_maximum(int k, vector<std::vector<int>> x) {
int n = x.size();
int m = x[0].size();
vector<int> maksimum(n,-1);
vector<int> minimum(n,10000000000000ll);
vector<int> pmin(n,-1ll);
vector<int> pmax(n,-1ll);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
minimum[i]=min(minimum[i],x[i][j]);
maksimum[i]=max(maksimum[i],x[i][j]);
if(minimum[i]==x[i][j])pmin[i]=j;
if(maksimum[i]==x[i][j])pmax[i]=j;
}
}
vector<vector<int>> dp(n+1);
for(int i=0;i<n+1;i++)dp[i].assign(n/2+1,0ll);
vector<vector<int>> potez(n+1);
for(int i=0;i<n+1;i++)potez[i].assign(n/2+1,0ll);
for(int j=1;j<n/2+1;j++){
dp[0][j]=dp[0][j-1]-minimum[j-1];
}
for(int i=1;i<n+1;i++){
for(int j=1;j<n/2+1;j++){
dp[i][j]=max(dp[i-1][j-1]+maksimum[i-1],dp[i-1][j]-minimum[i-1]);
if(dp[i][j]==dp[i-1][j-1]+maksimum[i-1])potez[i][j]=1;
}
}
vector<vector<int>> ans(n);
for(int i=0;i<n;i++)ans[i].assign(m,-1);
int red=n/2-1;
for(int i=n;i>0;i--){
if(potez[i][red]==1)ans[i-1][pmax[i-1]]=0;
else ans[i-1][pmin[i-1]]=0;
red-=potez[i][red];
}
allocate_tickets(ans);
return dp[n][n/2];
}