結果
問題 | No.3148 Min-Cost Destruction of Parentheses |
ユーザー |
|
提出日時 | 2025-05-16 23:04:13 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 143 ms / 4,000 ms |
コード長 | 2,293 bytes |
コンパイル時間 | 3,791 ms |
コンパイル使用メモリ | 294,748 KB |
実行使用メモリ | 11,648 KB |
最終ジャッジ日時 | 2025-05-16 23:04:20 |
合計ジャッジ時間 | 6,626 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 31 |
ソースコード
#include <bits/stdc++.h> using namespace std; using ll = long long; const ll INF = 1e18; #define sz(x) (int)(x).size() #define rep(i, n) for (int i = 0; i < n; i++) #define FOR(i, l, r) for(int i = l; i < r; i++) #define all(v) (v).begin(), (v).end() template<typename T> ostream &operator<< (ostream& os, const vector<T> &v){ rep(i, sz(v)) { os << v[i]; if (i < sz(v)-1)os << " "; } return os; } void out(){ cout << endl; } template<typename Head, typename ...Tail> void out(Head h, Tail ...t) { cout << h << " "; out(t...); } const int inf = 1e9; const ll mod = 998244353; using pii = pair<int, int>; #include <atcoder/dsu> #include <atcoder/modint> using mint = atcoder::modint998244353; void solve() { int n;cin >> n; string S;cin >> S; vector<int> a(n+1); rep(i, n) cin >> a[i+1]; vector<int> p(n + 1, -1); stack<int> sk;sk.push(0); int t = 1; rep(i, n * 2) { if (S[i] == '(') { p[t] = sk.top(); sk.push(t++); } else { sk.pop(); } } // FOR(i, 1, n+1) cerr << p[i] << " "; // cerr << endl; vector<int> cnt(n+1, 1);cnt[0] = 0; vector<ll> sum(n+1, 0); FOR(i, 1, n + 1) sum[i] = a[i]; vector<ll> ans(n + 1, 0); FOR(i, 1, n + 1) ans[i] = a[i]; auto cmp = [&](int a, int b) { if(cnt[a] * sum[b] == cnt[b] * sum[a]) return a < b; else return (cnt[a] * sum[b] < cnt[b] * sum[a]); }; set<int, decltype(cmp)> pq(cmp); FOR(i, 1, n + 1) { pq.insert(i); } // out(pq.size()); atcoder::dsu dsu(n+1); vector<int> mindex(n+1);iota(all(mindex), 0); int c = pq.size(); rep(_, n) { // assert(!pq.empty());out(pq.size(), c); auto x = pq.begin(); int i = *x, j = dsu.leader(p[mindex[i]]); // assert(!dsu.same(i, j)); int nxt = dsu.merge(i, j); pq.erase(i),c--;if (mindex[j] > 0)pq.erase(j),c--; // out(i, j, nxt); mindex[nxt] = min(mindex[i], mindex[j]); ans[nxt] = ans[i] + ans[j] + cnt[j] * sum[i]; sum[nxt] = sum[i] + sum[j]; cnt[nxt] = cnt[i] + cnt[j]; if (mindex[nxt] > 0) pq.insert(nxt),c++; } // out(ans); ll s = sum[dsu.leader(0)]; cout << ans[dsu.leader(0)]<< endl; } int main() { std::cin.tie(0)->sync_with_stdio(0); // int T;cin >> T; int T = 1; while(T--) solve(); }