# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
127396 | E869120 | DEL13 (info1cup18_del13) | C++14 | 352 ms | 23540 KiB |
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 <iostream>
#include <algorithm>
#include <vector>
using namespace std;
#pragma warning (disable: 4996)
int col[1 << 18], cl[1 << 18], cr[1 << 18];
int dp[1009][1009], pres[1009][1009];
vector<int> solve(int N, vector<int>A) {
if ((N - (int)A.size()) % 2 == 1) return vector<int>{-1};
if (A.size() == 0) return vector<int>{-1};
for (int i = 0; i <= N + 1; i++) {
col[i] = -1; cl[i] = (1 << 30); cr[i] = -(1 << 30);
for (int j = 0; j <= N + 1; j++) { dp[i][j] = 0; pres[i][j] = -1; }
}
if (N <= 1) {
dp[0][0] = 1;
for (int i = 1; i <= A.size(); i++) {
for (int j = 1; j <= N; j++) {
for (int k = 0; k < j; k++) {
if (dp[i - 1][k] == 0) continue;
int el = k + 1, er = j;
if (el == er && A[i - 1] != er) continue;
if (el != er && !(el < A[i - 1] && A[i - 1] < er)) continue;
if ((er - el) % 2 == 1) continue;
dp[i][j] = 1;
pres[i][j] = k;
}
}
}
if (dp[A.size()][N] == 0) return vector<int>{-1};
int cy = N;
for (int i = A.size(); i >= 1; i--) {
for (int j = cy; j > pres[i][cy]; j--) col[j] = i;
cy = pres[i][cy];
}
}
else {
for (int i = 1; i <= A.size(); i++) { col[A[i - 1]] = i; }
int id = -1;
for (int i = 2; i <= N; i++) {
if (col[i - 1] == -1 && col[i] >= 0 && col[i + 1] == -1) id = col[i];
}
if (id == -1) return vector<int>{-1};
for (int i = 1; i <= N; i++) { if (col[i] == -1) col[i] = id; }
}
for (int i = 1; i <= N; i++) {
cl[col[i]] = min(cl[col[i]], i);
cr[col[i]] = max(cr[col[i]], i);
}
vector<int>ans;
for (int i = 1; i <= A.size(); i++) {
if (cl[i] == cr[i]) continue;
int lefthand = A[i - 1] - cl[i], righthand = cr[i] - A[i - 1];
if (lefthand == 0 || righthand == 0) return vector<int>{-1};
if ((cr[i] - cl[i]) % 2 == 1) return vector<int>{-1};
if (lefthand <= righthand) {
int mid = cr[i] - (righthand - lefthand) / 2;
for (int j = 0; j < (righthand - lefthand) / 2; j++) ans.push_back(mid);
for (int j = 0; j < lefthand; j++) ans.push_back(A[i - 1]);
}
if (lefthand > righthand) {
int mid = cl[i] + (lefthand - righthand) / 2;
for (int j = 0; j < (lefthand - righthand) / 2; j++) ans.push_back(mid);
for (int j = 0; j < righthand; j++) ans.push_back(A[i - 1]);
}
}
return ans;
}
int main() {
int T; scanf("%d", &T);
for (int i = 1; i <= T; i++) {
int N1, V1; vector<int>A1;
scanf("%d%d", &N1, &V1);
for (int j = 1; j <= V1; j++) { int p; scanf("%d", &p); A1.push_back(p); }
vector<int>L = solve(N1, A1);
if (L == vector<int>{-1}) printf("-1\n");
else {
printf("%d\n", L.size());
for (int j = 0; j < L.size(); j++) { if (j) printf(" "); printf("%d", L[j]); }
printf("\n");
}
}
return 0;
}
Compilation message (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... |