Submission #172169

#TimeUsernameProblemLanguageResultExecution timeMemory
172169emil_physmathNice sequence (IZhO18_sequence)C++17
6 / 100
11 ms9724 KiB
#include <algorithm> #include <iostream> #include <vector> #include <set> using namespace std; typedef double ldouble; typedef long long llong; typedef unsigned int uint; const int maxN = 100001; vector<int> nei[400001]; int a[400001]; bool used[400001]; void DFS(int v, vector<int>& order) { used[v] = true; for (int to: nei[v]) if (!used[to]) DFS(to, order); order.push_back(v); } bool Check(int n, int m, int len) { if (len >= n) { llong sum = 0; for (int i = 1; i <= n; ++i) sum += a[i]; if (sum >= 0) return false; for (int i = 2; i + n - 1 <= len; ++i) { sum -= a[i - 1]; sum += a[i + n - 1]; if (sum >= 0) return false; } } if (len >= m) { llong sum = 0; for (int i = 1; i <= m; ++i) sum += a[i]; if (sum <= 0) return false; for (int i = 2; i + m - 1 <= len; ++i) { sum -= a[i - 1]; sum += a[i + m - 1]; if (sum <= 0) return false; } } return true; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int t; cin >> t; while (t--) { int n, m; cin >> n >> m; int ans = max(n, m) - 1; vector<int> ansArr(max(n, m) - 1, n < m ? -1 : 1); int l = max(n, m)/* + 0.5 * min(n, m) - 1*/, r = 2 * max(n, m) - max(n, m) % min(n, m) - 1 - 1; r = min(r, n + m + max(n, m) % min(n, m) - 2); bool up = true; int prevLen = 0; while (l <= r) { int len = (l + r) / 2; for (int i = 0; i <= len; ++i) { used[i] = false; if (!up) vector<int>().swap(nei[i]); } for (int i = (up ? prevLen + 1 : 1); i <= len; ++i) { if (i - n >= 0) nei[i].push_back(i - n); if (i - m >= 0) nei[i - m].push_back(i); } vector<int> order; for (int i = 0; i <= len; ++i) if (!used[i]) DFS(i, order); reverse(order.begin(), order.end()); vector<int> pref(len + 1); for (int i = 0; i < order.size(); ++i) pref[order[i]] = i; for (int i = 1; i < pref.size(); ++i) pref[i] -= pref[0]; pref[0] = 0; for (int i = 1; i <= len; ++i) a[i] = pref[i] - pref[i - 1]; if (Check(n, m, len)) { ans = len; ansArr.resize(len); for (int i = 0; i < len; ++i) ansArr[i] = a[i + 1]; l = len + 1; up = true; prevLen = len; } else { r = len - 1; up = false; } } cout << ans << endl; for (int i = 0; i < ans; ++i) cout << ansArr[i] << ' '; cout << '\n'; } }

Compilation message (stderr)

sequence.cpp: In function 'int main()':
sequence.cpp:92:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             for (int i = 0; i < order.size(); ++i)
                             ~~^~~~~~~~~~~~~~
sequence.cpp:94:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             for (int i = 1; i < pref.size(); ++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...
#Verdict Execution timeMemoryGrader output
Fetching results...