Submission #378896

#TimeUsernameProblemLanguageResultExecution timeMemory
378896abc864197532Nice sequence (IZhO18_sequence)C++17
100 / 100
1422 ms32840 KiB
#include <bits/stdc++.h>
using namespace std;
#define lli long long int
#define pii pair<int, int>
#define pll pair<lli, lli>
#define X first
#define Y second
#define pb push_back
#define eb emplace_back
#define mp make_pair
#define test(x) cout << #x << ' ' << x << endl
#define printv(x) {\
    for (auto a : x) cout << a << ' ';\
    cout << endl;\
}
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()

vector <int> pre_ans;

bool ask(int n, int m, int N) {
    vector <int> in(N + 1, 0);
    for (int i = 0; i + n <= N; ++i) in[i]++;
    for (int i = 0; i + m <= N; ++i) in[i + m]++;
    queue <int> q;
    pre_ans.clear();
    for (int i = 0; i <= N; ++i) if (!in[i]) q.push(i);
    while (!q.empty()) {
        int v = q.front(); q.pop();
        pre_ans.pb(v);
        if (v - n >= 0) {
            --in[v - n];
            if (!in[v - n]) q.push(v - n);
        }
        if (v + m <= N) {
            --in[v + m];
            if (!in[v + m]) q.push(v + m);
        }
    }
    return pre_ans.size() == N + 1;
}

void solve() {
    int n, m;
    cin >> n >> m;
    int l = max(n, m) - 1, r = max(n, m) * 2 + 1;
    while (r - l > 1) {
        int mid = l + r >> 1;
        if (ask(n, m, mid)) l = mid;
        else r = mid;
    }
    ask(n, m, l);
    cout << l << '\n';
    vector <int> pre(l + 1, 0);
    int t = 0;
    for (int i : pre_ans) pre[i] = t++;
    for (int i = 1; i <= l; ++i) cout << pre[i] - pre[i - 1] << ' ';
    if (l) cout << '\n';
}

int main () {
    ios::sync_with_stdio(false);
    cin.tie(0);
    int t;
    cin >> t;
    while (t--) solve();
}

Compilation message (stderr)

sequence.cpp: In function 'bool ask(int, int, int)':
sequence.cpp:40:27: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   40 |     return pre_ans.size() == N + 1;
      |            ~~~~~~~~~~~~~~~^~~~~~~~
sequence.cpp: In function 'void solve()':
sequence.cpp:48:21: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   48 |         int mid = l + r >> 1;
      |                   ~~^~~
#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...