結果
問題 | No.3025 Chocol∀te |
ユーザー |
![]() |
提出日時 | 2025-02-15 16:32:09 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 701 ms / 2,000 ms |
コード長 | 2,299 bytes |
コンパイル時間 | 3,953 ms |
コンパイル使用メモリ | 291,960 KB |
実行使用メモリ | 42,932 KB |
最終ジャッジ日時 | 2025-02-15 16:32:45 |
合計ジャッジ時間 | 28,906 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 77 |
ソースコード
#include <bits/stdc++.h>//#include <atcoder/all>using namespace std;//using namespace atcoder;//using mint = modint1000000007;//const int mod = 1000000007;//using mint = modint998244353;//const int mod = 998244353;//const int INF = 1e9;//const long long LINF = 1e18;#define rep(i, n) for (int i = 0; i < (n); ++i)#define rep2(i,l,r)for(int i=(l);i<(r);++i)#define rrep(i, n) for (int i = (n) - 1; i >= 0; --i)#define rrep2(i,l,r)for(int i=(r) - 1;i>=(l);--i)#define all(x) (x).begin(),(x).end()#define allR(x) (x).rbegin(),(x).rend()#define P pair<int,int>template<typename A, typename B> inline bool chmax(A & a, const B & b) { if (a < b) { a = b; return true; } return false; }template<typename A, typename B> inline bool chmin(A & a, const B & b) { if (a > b) { a = b; return true; } return false; }int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int n, m; cin >> n >> m;const int th = 400;vector<unordered_set<int>>g(n);vector<int> big_deg;vector<bool>big(n);vector<long long>a(n), sum(n);vector<vector<bool>>h(n);auto add_edge = [&](int from, int to)->void {if (g[from].count(to)) {// removeg[from].erase(to);if (!big[from])sum[to] -= a[from];else h[from][to] = false;}else {// addg[from].insert(to);if (!big[from]) {sum[to] += a[from];if (g[from].size() == th) {// sumall->bigbig_deg.push_back(from);big[from] = true;h[from].resize(n, false);for (auto e : g[from]) {h[from][e] = true;sum[e] -= a[from];}}}else {h[from][to] = true;}}};auto update_a = [&](int index, int na)->void {int diff = na - a[index];a[index] = na;if (!big[index]) {for (auto e : g[index])sum[e] += diff;}};rep(i, m) {int a, b; cin >> a >> b;a--, b--;add_edge(a, b);add_edge(b, a);}rep(i, n) {int a; cin >> a;update_a(i, a);}int q; cin >> q;while (q--) {int t; cin >> t;if (t == 1) {int a, b; cin >> a >> b;a--, b--;add_edge(a, b);add_edge(b, a);}else if (t == 2) {int i, a; cin >> i >> a;i--;update_a(i, a);}else {int c; cin >> c;c--;long long ans = sum[c];for (auto x : big_deg) if (h[x][c]) ans += a[x];cout << ans << endl;}}return 0;}