# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1051545 | pcc | 카니발 티켓 (IOI20_tickets) | C++17 | 3083 ms | 173060 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "tickets.h"
#include <vector>
#include <bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,popcnt,sse4")
using namespace std;
#define ll long long
#define pll pair<ll,ll>
#define pii pair<int,int>
#define fs first
#define sc second
/*
int n = x.size();
int m = x[0].size();
std::vector<std::vector<int>> answer;
for (int i = 0; i < n; i++) {
std::vector<int> row(m);
for (int j = 0; j < m; j++) {
if (j < k) {
row[j] = j;
} else {
row[j] = -1;
}
}
answer.push_back(row);
}
allocate_tickets(answer);
return 1;
*/
const ll inf = 1e18;
const int mxn = 2022;
vector<vector<int>> ansv;
vector<vector<ll>> dp;
vector<vector<int>> pre;
vector<pll> choice[mxn];
int len[mxn];
long long find_maximum(int k, std::vector<std::vector<int>> x) {
int N = x.size();
int M = x[0].size();
int K = k;
ansv = vector<vector<int>>(N,vector<int>(M,-1));
dp = vector<vector<ll>>(N+1,vector<ll>(N*K/2+1,-inf));
pre = vector<vector<int>>(N+1,vector<int>(N*K/2+1,-1));
for(int i = 0;i<N;i++){
int pl = 0,pr = M-1;
ll sum = 0;
for(int j = 0;j<K;j++)sum -= x[i][pl++];
choice[i].push_back(pll(sum,K));
for(int j = 1;j<=K;j++){
sum += x[i][--pl];
sum += x[i][pr--];
cerr<<i<<":"<<sum<<endl;
choice[i].push_back(pll(sum,pl));
}
reverse(choice[i].begin(),choice[i].end());
}
cerr<<"DPING"<<endl;
for(int i = 0;i<N;i++){
for(auto &j:choice[i])cerr<<j.fs<<' '<<j.sc<<',';cerr<<endl;
}cerr<<endl;
dp[0][0] = 0;
for(int i = 1;i<=N;i++){
for(int j = 0;j<choice[i-1].size();j++){
pll now = choice[i-1][j];
for(int k = now.sc;k<=(N*K)/2;k++){
if(dp[i][k]<=dp[i-1][k-now.sc]+now.fs){
dp[i][k] = dp[i-1][k-now.sc]+now.fs;
pre[i][k] = j;
}
}
}
}
cerr<<"DP DONE!"<<endl;
for(int i = 0;i<=N;i++){
for(int j = 0;j<=N*K/2;j++)cerr<<dp[i][j]<<' ';cerr<<endl;
}cerr<<endl;
for(int i = 0;i<=N;i++){
for(int j = 0;j<=N*K/2;j++)cerr<<pre[i][j]<<' ';cerr<<endl;
}cerr<<endl;
ll ans = dp[N][N*K/2];
int now = N*K/2;
for(int i = N;i>=1;i--){
len[i-1] = pre[i][now];
now -= pre[i][now];
}
cerr<<"LEN: ";for(int i = 0;i<N;i++)cerr<<len[i]<<' ';cerr<<endl;
int C = 0;
for(int i = 0;i<N;i++){
for(int j = 0;j<len[i];j++)ansv[i][j] = C,C = (C+1)%K;
}
for(int i = 0;i<N;i++){
set<int> st;
for(int j = 0;j<K;j++)st.insert(j);
for(int j = 0;j<len[i];j++)st.erase(ansv[i][j]);
for(int j = 0;j<K-len[i];j++){
ansv[i][M-1-j] = *st.begin();
st.erase(st.begin());
}
}
allocate_tickets(ansv);
return ans;
}
컴파일 시 표준 에러 (stderr) 메시지
# | 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... |