結果
| 問題 | No.3407 Birds-of-Paradise' Christmas Live |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-12-14 01:23:08 |
| 言語 | C++17 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,757 bytes |
| 記録 | |
| コンパイル時間 | 1,812 ms |
| コンパイル使用メモリ | 209,564 KB |
| 実行使用メモリ | 19,088 KB |
| 最終ジャッジ日時 | 2025-12-14 01:23:13 |
| 合計ジャッジ時間 | 4,610 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 5 WA * 15 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
template<class T> istream& operator >> (istream& is, vector<T>& vec) {
for(T& x : vec) is >> x;
return is;
}
template<class T> ostream& operator << (ostream& os, const vector<T>& vec) {
if(vec.empty()) return os;
os << vec[0];
for(auto it = vec.begin(); ++it != vec.end(); ) os << ' ' << *it;
return os;
}
/*
考察
00ではない区間をいい感じに忘れ去れる問題
01,10の区間で0の方
11の区間ならどちらでも可能
11の区間をどう使うかがミソ
-> 2乗なので隣接のうち大きい方に付ければ良さそう
01 11 01 11
みたいなのときにどっちに付けて良いか分からなくないか...
*/
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int n, m;
cin >> n;
vector<int> w(n);
cin >> w >> m;
vector<int> s(m);
cin >> s;
vector<int> ca;
ca.reserve(n + m);
w.insert(w.begin(), 0);
for(int i = 0; i < n; i++)w[i + 1] += w[i];
ca.insert(ca.end(), w.begin(), w.end());
s.insert(s.begin(), 0);
for(int i = 0; i < m; i++) s[i + 1] += s[i];
ca.insert(ca.end(), s.begin(), s.end());
sort(ca.begin(), ca.end());
ca.erase(unique(ca.begin(), ca.end()), ca.end());
int S = 0;
vector<pair<int,int>> b;
for(int i = 0, wi = 0, si = 0; i + 1 < ca.size(); i++){
int dt = ca[i + 1] - ca[i];
while(wi <= n && ca[i] == w[wi]){
wi++;
S ^= 1;
}
while(si <= m && ca[i] == s[si]){
si++;
S ^= 2;
}
b.emplace_back(dt, S);
}
// 1 - 3 - 1
// 2 - 3 - 2
// のように挟まれた3をマージする
vector<pair<int,int>> c;
c.emplace_back(b[0]);
for(int i = 1; i < b.size(); i++){
if(b[i].second != 3){
c.emplace_back(b[i]);
continue;
}
if(c.back().second == 0){
c.emplace_back(b[i]);
continue;
}
if(i + 1 < b.size() && c.back().second == b[i + 1].second){
c.back().first += b[i].first + b[i + 1].first;
i++;
}else{
c.emplace_back(b[i]);
}
}
vector<ll> dp(c.size() + 1);
for(int i = 0; i < c.size(); i++){
auto [cnt, S] = c[i];
if(S == 0){
dp[i + 1] = max(dp[i + 1], dp[i]);
continue;
}
dp[i + 1] = max(dp[i + 1], dp[i] + cnt * (ll)(cnt));
if(i + 1 < c.size()){
auto [cnt2, S2] = c[i + 1];
if(max(S, S2) != 3 || min(S, S2) == 0) continue;
cnt += cnt2;
dp[i + 2] = max(dp[i + 2], dp[i] + cnt * (ll)(cnt));
}
}
cout << dp.back() << '\n';
}