結果
問題 |
No.3058 Deque and Brackets
|
ユーザー |
![]() |
提出日時 | 2025-07-12 05:15:56 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 63 ms / 2,000 ms |
コード長 | 2,647 bytes |
コンパイル時間 | 1,031 ms |
コンパイル使用メモリ | 77,696 KB |
実行使用メモリ | 7,808 KB |
最終ジャッジ日時 | 2025-07-12 05:16:00 |
合計ジャッジ時間 | 3,864 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 22 |
ソースコード
#include <iostream> #include <queue> #include <cassert> using namespace std; typedef long long ll; char c[200010]; ll l[200010],r[200010],inf = 1000000000000000; int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); int i,n; cin >> n; for(i=0;i<2*n;i++) cin >> c[i] >> l[i] >> r[i]; ll ans = 0; // le := (で左に来たやつ // ri := )で右に来たやつ ll le = 0,ri = 0; // quel := )で左に来てるやつ // quer := (で右に来てるやつ priority_queue<ll,vector<ll>,greater<ll>> quel,quer; for(i=2*n - 1;i>=0;i--){ if(c[i]=='('){ if(l[i]>=r[i]){ ans += l[i]; le++; }else{ ans += l[i]; ll d = r[i] - l[i]; if(quer.size()<ri){ ans += d; quer.push(d); }else{ // querと交換 or quelを一個右側に持っていく ll valr = quer.size() ? quer.top() : inf; ll vall = quel.size() ? quel.top() : inf; if(vall<valr && vall<d){ ans += d - vall; quel.pop(); quer.push(d); ri++; }else if(valr<=vall && valr<d){ ans += d - valr; quer.pop(); quer.push(d); le++; }else{ le++; } } } }else{ if(l[i]<=r[i]){ ans += r[i]; ri++; }else{ ans += r[i]; ll d = l[i] - r[i]; if(quel.size()<le){ quel.push(d); ans += d; }else{ // quelと交換 or querを一個左側に持っていく ll valr = quer.size() ? quer.top() : inf; ll vall = quel.size() ? quel.top() : inf; if(vall<valr && vall<d){ ans += d - vall; quel.pop(); quel.push(d); ri++; }else if(valr<=vall && valr<d){ ans += d - valr; quer.pop(); quel.push(d); le++; }else{ ri++; } } } } assert(quel.size()<=le); assert(quer.size()<=ri); // cout << le << " " << ri << " " << quel.size() << " " << quer.size() << " " << (le + ri + quel.size() + quer.size()) << "\n"; } cout << ans << "\n"; }