結果
| 問題 | No.3407 Birds-of-Paradise' Christmas Live |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 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 |
| 記録 | |
| コンパイル時間 | 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);
| ~~~~~^~~~~~~~~~
ソースコード
#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;
}