Submission #916939

#TimeUsernameProblemLanguageResultExecution timeMemory
916939andrei_iorgulescuDEL13 (info1cup18_del13)C++14
0 / 100
974 ms18268 KiB
#include <bits/stdc++.h> using namespace std; int n,q,p[100005]; vector<bool> dp[100005];///pot sa fac primele i a.i sa am las j in grupul de dupa? vector<pair<int,int>> pre[100005];///daca dp[i][j] e adevarat, fac operatia op[i][j] si merg in starea pre[i][j] vector<pair<int,int>> op[100005]; bool orr(bool xx,bool yy) { if (xx == true or yy == true) return true; return false; } void solveq1() { int parl,parr; if (p[1] % 2 == 1) parl = 0; else parl = 1; if ((n - p[1]) % 2 == 1) parr = 1; else parr = 0; if (parl != parr) { cout << -1 << '\n'; return; } if (parl == 1) { cout << (n - 1) / 2 << '\n'; int mijl = p[1] / 2; int cate = (n - 1) / 2; for (int i = 1; i <= p[1] - mijl - 1; i++) cout << mijl << ' ',cate--; int mijr = (2 * n - p[1] + 1) / 2; for (int i = mijr + 1; i <= n; i++) cout << mijr << ' ',cate--; for (int i = 1; i <= cate; i++) cout << p[1] << ' '; cout << '\n'; return; } if (p[1] == 1 or p[1] == n) { if (n == 1) { cout << 0 << '\n'; return; } cout << -1 << '\n'; return; } int mijl = p[1] / 2; cout << (n - 1) / 2 << '\n'; for (int i = 1; i < mijl; i++) cout << mijl << ' '; int dif = n - p[1]; int mijr = n - (dif / 2) + 1; for (int i = 1; i < dif / 2; i++) cout << mijr << ' '; cout << p[1] << ' ' << p[1] << '\n'; } void testcase() { cin >> n >> q; for (int i = 1; i <= q; i++) cin >> p[i]; if (q == 1) { solveq1(); return; } p[q + 1] = n + 1; for (int i = 1; i <= q; i++) { dp[i].resize(p[i + 1] - p[i],false); pre[i].resize(p[i + 1] - p[i],{0,0}); op[i].resize(p[i + 1] - p[i],{0,0}); for (int j = 0; j <= p[i + 1] - p[i] - 1; j++) { dp[i][j] = false; pre[i][j] = {0,0}; op[i][j] = {0,0}; } } for (int j = 0; j <= p[2] - p[1] - 1; j++) { ///raman j pe spatiu if (j == p[2] - p[1] - 1) { if (p[1] == 1) dp[1][j] = true; else dp[1][j] = false; } else { int nrop = p[2] - p[1] - 1 - j; if (nrop >= p[1] or (p[1] - 1 - nrop) % 2 != 0) dp[1][j] = false; else dp[1][j] = true; } //cout << (int)dp[1][j] << ' '; } //cout << '\n'; for (int i = 2; i <= q; i++) { for (int j = 0; j <= p[i + 1] - p[i] - 1; j++) { int nrop = p[i + 1] - p[i] - 1 - j; ///vin din dp[i - 1][q], q >= nrop si q de aceeasi paritate cu nrop ///partea proasta e cand nrop = 0,q = p[i] - p[i - 1] - 1 if (nrop != 0) { for (int q = nrop; q <= p[i] - p[i - 1] - 1; q += 2) dp[i][j] = orr(dp[i - 1][q],dp[i][j]); } else { for (int q = nrop; q <= p[i] - p[i - 1] - 1; q += 2) if (q != p[i] - p[i - 1] - 1 or p[i] - p[i - 1] - 1 == 0) dp[i][j] = orr(dp[i - 1][q],dp[i][j]); } //cout << (int)dp[i][j] << ' '; } //cout << '\n'; } bool ans = false; for (int i = 0; i <= n - p[q]; i += 2) { if (i != n - p[q]) ans = orr(ans,dp[q][i]); else if (n == p[q]) ans = orr(ans,dp[q][i]); } if (ans == true) cout << 0 << '\n'; else cout << -1 << '\n'; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int tc; cin >> tc; while (tc--) testcase(); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...