結果
| 問題 | No.3605 Grand Cross |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-08-01 01:13:51 |
| 言語 | C++17 (gcc 15.2.0 + boost 1.90.0) |
| 結果 |
AC
|
| 実行時間 | 216 ms / 2,000 ms |
| + 393µs | |
| コード長 | 2,385 bytes |
| 記録 | |
| コンパイル時間 | 1,701 ms |
| コンパイル使用メモリ | 231,232 KB |
| 実行使用メモリ | 39,224 KB |
| 最終ジャッジ日時 | 2026-08-01 01:14:09 |
| 合計ジャッジ時間 | 11,217 ms |
|
ジャッジサーバーID (参考情報) |
judge2_0 / judge3_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 49 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int T; cin >> T;
while(T--){
int N,M; cin >> N >> M;
vector<long long> A(N),B(M),C(N),D(M);
for(auto &a : A) cin >> a;
for(auto &b : B) cin >> b;
for(auto &a : C) cin >> a,a--;
for(auto &b : D) cin >> b,b--;
long long answer = -1;
auto f = [&]() -> void {
vector<long long> T = B;
for(int i=1; i<M; i++) T.at(i) += T.at(i-1);
auto Trange = [&](int l,int r) -> long long {
long long ret = T.at(r);
if(l) ret -= T.at(l-1);
return ret;
};
vector<vector<pair<int,long long>>> P(N+M);
vector<vector<pair<int,int>>> Q(N+M);
long long sum = 0;
for(int i=0; i<N; i++){
sum += A.at(i);
if(i%2 == 0) P.at(C.at(i/2)).push_back({i/2,sum});
}
for(int i=0; i<M; i++) Q.at(D.at(i)).push_back({min(i,M-1-i),i});
for(int t=0; t<N+M; t++) if(P.at(t).size() && Q.at(t).size()){
auto &p = P.at(t);
auto &q = Q.at(t);
sort(q.begin(),q.end());
int n = p.size(),m = q.size(),pos = 0;
p.push_back({1001001,-1});
for(int i=0; i<n; i++){
auto [len,s] = p.at(i);
auto [len2,ign] = p.at(i+1);
while(pos < m){
auto [ok,mid] = q.at(pos);
if(ok < len){pos++; continue;}
else if(ok < len2){
long long now = s+Trange(mid-len,mid+len);
answer = max(answer,now),pos++;
}
else break;
}
}
}
};
f();
reverse(A.begin(),A.end());
reverse(B.begin(),B.end());
reverse(C.begin(),C.end());
reverse(D.begin(),D.end());
f();
swap(N,M),swap(A,B),swap(C,D);
f();
reverse(A.begin(),A.end());
reverse(B.begin(),B.end());
reverse(C.begin(),C.end());
reverse(D.begin(),D.end());
f();
cout << answer << "\n";
}
}