Submission #578746

#TimeUsernameProblemLanguageResultExecution timeMemory
578746kidesoKpart (eJOI21_kpart)C++17
30 / 100
2072 ms328 KiB
#include <iostream> #include <queue> #include <algorithm> using namespace std; vector<int> x, ans; vector<bool> y; int N; bool check(int l, int r, int sum) { vector<int> dp(sum + 1, 0); dp[0] = 1; for (int i = l; i <= r; ++i) { for (int j = sum; j >= 0; --j) if (dp[j] != 0 && j + x[i] <= sum) { dp[j + x[i]] = 1; if (j + x[i] == sum) return true; } } return false; } vector<int> solve() { vector<int> A; cin >> N; x.assign(N + 1, 0); y.assign(N + 1, false); for (int i = 1; i <= N; ++i) cin >> x[i]; for (int K = 2; K <= N; ++K) if (!y[K]) { int sum = 0; bool ok = true; for (int i = 1; i <= K; ++i) sum += x[i]; for (int i = K + 1; i <= N; ++i) { if (x[i] == x[i - K]) continue; if (sum % 2 != 0) { ok = false; break; } if (!check(i - K, i - 1, sum / 2)) { ok = false; break; } sum -= x[i - K]; sum += x[i]; } if (sum % 2 == 1 || !check(N - K + 1, N, sum / 2)) ok = false; if (ok) { for (int i = K; i <= N; i += K) { if (!y[i]) A.push_back(i); y[i] = true; } } } return A; } int main() { int T; cin >> T; while (T--) { ans = solve(); sort(ans.begin(), ans.end()); cout << ans.size() << ' '; for (auto e : ans) cout << e << ' '; cout << '\n'; ans.clear(); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...