結果
| 問題 |
No.3322 引っ張りだこ
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-11-01 00:05:20 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,844 bytes |
| コンパイル時間 | 2,521 ms |
| コンパイル使用メモリ | 219,844 KB |
| 実行使用メモリ | 24,712 KB |
| 最終ジャッジ日時 | 2025-11-01 00:05:32 |
| 合計ジャッジ時間 | 10,743 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 16 WA * 27 |
ソースコード
#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,K; cin >> N >> K;
vector<long long> A(N),B(N);
for(auto &a : A) cin >> a;
for(auto &b : B) cin >> b;
if(K == 0){
cout << accumulate(A.begin(),A.end(),0LL) << "\n";
continue;
}
long long answer = 0;
vector<long long> D(N);
vector<int> plus,minus;
bool isA = true;
int move = 0;
for(int i=0; i<N; i++){
answer += min(A.at(i),B.at(i));
D.at(i) = A.at(i)-B.at(i);
if(D.at(i) >= 0) plus.push_back(i),move += !isA,isA = true;
else minus.push_back(i),move += isA,isA = false;
}
if(isA) minus.push_back(N);
else plus.push_back(N);
vector<pair<long long,int>> diff;
for(int i=0; i+1<plus.size(); i++){
int p1 = plus.at(i),p2 = plus.at(i+1);
if(p1+1 == p2) continue;
long long dec = 0;
for(int p=p1+1; p<p2; p++) dec += B.at(p)-A.at(p);
diff.push_back({dec,i+1});
}
for(int i=0; i+1<minus.size(); i++){
int p1 = minus.at(i),p2 = minus.at(i+1);
if(p1+1 == p2) continue;
long long dec = 0;
for(int p=p1+1; p<p2; p++) dec += A.at(p)-B.at(p);
diff.push_back({dec,-(i+1)});
}
sort(diff.rbegin(),diff.rend());
auto memodiff = diff;
int memomove = move;
set<int> S;
for(int i=0; i<N; i++) S.insert(i);
while(move > K){
auto [ign,pos] = diff.back(); diff.pop_back();
int p1,p2;
if(pos > 0) p1 = plus.at(pos-1),p2 = plus.at(pos);
else p1 = minus.at(-pos-1),p2 = minus.at(-pos);
if(!S.count(abs(p1))) continue;
move -= 2;
if(p2 == N) move++;
for(int p=p1+1; p<p2; p++) S.erase(p);
}
long long answer2 = answer;
for(auto pos : S) answer += max(A.at(pos),B.at(pos))-min(A.at(pos),B.at(pos));
swap(answer,answer2);
diff = memodiff,move = memomove;
for(int i=0; i<N; i++) S.insert(i);
while(move > K && diff.size()){
auto [ign,pos] = diff.back(); diff.pop_back();
int p1,p2;
if(pos > 0) p1 = plus.at(pos-1),p2 = plus.at(pos);
else p1 = minus.at(-pos-1),p2 = minus.at(-pos);
if(p2 == N) continue;
if(!S.count(abs(p1))) continue;
move -= 2;
for(int p=p1+1; p<p2; p++) S.erase(p);
}
if(move <= K) for(auto pos : S) answer += max(A.at(pos),B.at(pos))-min(A.at(pos),B.at(pos));
cout << max(answer,answer2) << "\n";
}
}