제출 #866961

#제출 시각아이디문제언어결과실행 시간메모리
866961Halym2007Bootfall (IZhO17_bootfall)C++11
28 / 100
1060 ms49204 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long const int N = 5e2 + 5; const int NN = 500*500 + 5; #define pb push_back #define sz size() #define ff first #define ss second vector <int> v, jog; int n, a[N], dp[NN], san[NN], sum; map <int, bool> m[NN]; int main () { // freopen("input.txt", "r", stdin); // freopen ("cykar.txt", "w", stdout); ios::sync_with_stdio(false); cin.tie(0); cin >> n; for (int i = 1; i <= n; ++i) { cin >> a[i]; sum += a[i]; } // for (int i = 1; i <= n; ++i) { // cout << a[i] << " "; // } // return 0; dp[0] = 1; for (int i = 1; i <= n; ++i) { for (int j = sum - a[i]; j >= 0; j--) { if (dp[j]) { dp[j + a[i]] = 1; m[j + a[i]][a[i]] = 1; for (auto jj : m[j]) { m[j + a[i]][jj.ff] = 1; } } } } if (sum % 2 == 1 or !dp[sum / 2]) { cout << "0\n"; return 0; } for (int i = 0; i <= sum; ++i) { if (dp[i]) { v.pb (i); } } for (int i = 1; i <= n; ++i) { map <int, bool> mp; for (int j : v) { // j we sum - j int grup1 = j; int grup2 = sum - j; if (m[grup1].find(a[i]) != m[grup1].end()) { int sum1 = grup1 - a[i]; int variant = abs(sum1 - grup2); if (mp.find (variant) == mp.end()) { san[variant]++; mp[variant] = 1; } } } } for (int i = 0; i <= sum; ++i) { if (san[i] == n) { jog.pb (i); } } cout << (int)jog.sz << "\n"; for (int i : jog) { cout << i << " "; } }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...