ad-hoc

· · 题解

随机区分的 trash round,但是来水题解

首先,重复的元素不考虑。

然后,观察 f,假设 x\le y 得到 f(x,y)=x+y\bmod x\in[x,y]

下面证明一下这个命题:取得答案的 y 一定可以是 \max\limits_{j=1}^ia_j

如果不可以是,那么 f(x,y)\le f(y,\max\limits_{j=1}^ia_j),证明完了。

然后我们还可以发现答案理论最大值是 \max\limits_{j=1}^ia_j,这也是比较显然的。

考虑如何维护。

代码大概是好懂好写的。

int n, a[1000005], ans, maxa;
signed main() {
    ios::sync_with_stdio(0); // 我不会告诉你不开这两句话会 TLE on 4
    cin.tie(0);
    cout.tie(0);
    multiple_cases(T) {
        cin >> n;
        set<int> st; // 去重用
        ans = maxa = 0;
        #define OVER st.insert(a[i]);           \
                     cout << ans << " ";        \
                     maxa = max(maxa, a[i]);    \
                     continue // 因为需要用两次,偷懒写为宏
        #define f(a, b) ((a) % (b) + (b) % (a)) // 朴素计算 f
        for (int i = 1; i <= n; i++) {
            cin >> a[i];
            if (st.count(a[i]) || i == 1) { // 对应上文说的小分讨
                OVER;
            } else if (a[i] < maxa) {
                ans = max(ans, f(a[i], maxa));
            } else if (a[i] < maxa * 2) {
                ans = a[i];
            } else {
                ans = 0;
                for (int j = 1; j < i; j++) {
                    ans = max(ans, f(a[i], a[j]));
                }
            }
            OVER;
        }
        cout << endl;
    }
    return 0;
}