結果

問題 No.3407 Birds-of-Paradise' Christmas Live
コンテスト
ユーザー The Forsaking
提出日時 2025-12-24 12:14:21
言語 C++17
(gcc 15.2.0 + boost 1.89.0)
結果
AC  
実行時間 60 ms / 2,000 ms
コード長 2,319 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 2,156 ms
コンパイル使用メモリ 201,756 KB
実行使用メモリ 9,492 KB
最終ジャッジ日時 2025-12-24 12:14:27
合計ジャッジ時間 5,285 ms
ジャッジサーバーID
(参考情報)
judge1 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 20
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:15:10: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
   15 |     scanf("%d", &n);
      |     ~~~~~^~~~~~~~~~
main.cpp:19:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
   19 |         scanf("%d", &x);
      |         ~~~~~^~~~~~~~~~
main.cpp:24:10: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
   24 |     scanf("%d", &m);
      |     ~~~~~^~~~~~~~~~
main.cpp:26:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
   26 |         scanf("%d", &x);
      |         ~~~~~^~~~~~~~~~

ソースコード

diff #
raw source code

#include <bits/stdc++.h>

using namespace std;

typedef pair<int, int> pii;
typedef long long ll;
const int N = 2000010, MOD = 1e9 + 7, INF = 0x3f3f3f3f;
int n, m, w[N];


struct Node { int l, r; };
inline ll g(int l, int r) { return l > r ? 0 : (ll)(r - l + 1) * (r - l + 1); }
ll f[N][2];
int main() {
    scanf("%d", &n);
    vector<Node> a = {{0, -1}}, b = {{-INF, -INF - 1}};
    int l = 1, r;
    for (int i = 1, x; i < n + 1; i++) {
        scanf("%d", &x);
        if ((i & 1) && x) a.push_back({l, l + x - 1});
        l += x;
    }
    l = 1;
    scanf("%d", &m);
    for (int i = 1, x; i < m + 1; i++) {
        scanf("%d", &x);
        if ((i & 1) && x) b.push_back({l, l + x - 1});
        l += x;
    }
    for (int i = 1; i < a.size(); i++) f[0][0] += g(a[i].l, a[i].r);
    a.push_back({INF + 1, INF});
    l = r = 0;
    vector<Node> c = {{-INF, -INF - 1}};
    for (int i = 1; i < b.size(); i++) {
        while (l < a.size() - 1 && a[l + 1].l < b[i].l) l++;
        while (a[r].r <= b[i].r) r++;
        if (l != r) c.push_back(b[i]);
    }
    swap(c, b);
    l = r = 0;
    for (int i = 1; i < b.size(); i++) {
        while (l < a.size() - 1 && a[l + 1].l < b[i].l) l++;
        while (a[r].r <= b[i].r) r++;
        ll c = 0;
        for (int j = l + 1; j < r; j++) c += g(a[j].l, a[j].r);
        ll v = g(max(b[i].l, a[l].r + 1), min(b[i].r, a[r].l - 1)) - c, vl = g(b[i].l, min(b[i].r, a[r].l - 1)) - c, \
            vr = g(max(b[i].l, a[l].r + 1), b[i].r) - c, vlr = g(b[i].l, b[i].r) - c, \
            c2 = -g(a[r].l, a[r].r) + g(max(b[i].r + 1, a[r].l), a[r].r);
        f[i][0] = max(f[i - 1][1], f[i - 1][0]) + v;
        f[i][0] = max(f[i][0], f[i - 1][0] + vl - g(a[l].l, a[l].r) + g(a[l].l, min(a[l].r, b[i].l - 1)));
        f[i][0] = max(f[i][0], f[i - 1][1] + vl - g(max(b[i - 1].r + 1, a[l].l), a[l].r) + g(max(b[i - 1].r + 1, a[l].l), min(a[l].r, b[i].l - 1)));

        f[i][1] = max(f[i - 1][0], f[i - 1][1]) + vr + c2;
        f[i][1] = max(f[i][1], f[i - 1][0] + vlr + c2 - g(a[l].l, a[l].r) + g(a[l].l, min(a[l].r, b[i].l - 1)));
        f[i][1] = max(f[i][1], f[i - 1][1] + vlr + c2 - g(max(b[i - 1].r + 1, a[l].l), a[l].r) + g(max(b[i - 1].r + 1, a[l].l), min(a[l].r, b[i].l - 1)));
    }
    printf("%lld\n", max(f[b.size() - 1][0], f[b.size() - 1][1]));
    return 0;
}
0