結果
問題 |
No.3025 Chocol∀te
|
ユーザー |
|
提出日時 | 2025-02-14 23:01:51 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
MLE
|
実行時間 | - |
コード長 | 22,049 bytes |
コンパイル時間 | 5,340 ms |
コンパイル使用メモリ | 330,784 KB |
実行使用メモリ | 1,159,452 KB |
最終ジャッジ日時 | 2025-02-14 23:02:46 |
合計ジャッジ時間 | 53,821 ms |
ジャッジサーバーID (参考情報) |
judge6 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 2 WA * 16 RE * 49 TLE * 9 MLE * 1 |
ソースコード
// #pragma GCC target("avx2") // #pragma GCC optimize("O3") // #pragma GCC optimize("unroll-loops") // #define INTERACTIVE #include <bits/stdc++.h> using namespace std; namespace templates { // type using ll = long long; using ull = unsigned long long; using Pii = pair<int, int>; using Pil = pair<int, ll>; using Pli = pair<ll, int>; using Pll = pair<ll, ll>; template <class T> using pq = priority_queue<T>; template <class T> using qp = priority_queue<T, vector<T>, greater<T>>; // clang-format off #define vec(T, A, ...) vector<T> A(__VA_ARGS__); #define vvec(T, A, h, ...) vector<vector<T>> A(h, vector<T>(__VA_ARGS__)); #define vvvec(T, A, h1, h2, ...) vector<vector<vector<T>>> A(h1, vector<vector<T>>(h2, vector<T>(__VA_ARGS__))); // clang-format on // for loop #define fori1(a) for (ll _ = 0; _ < (a); _++) #define fori2(i, a) for (ll i = 0; i < (a); i++) #define fori3(i, a, b) for (ll i = (a); i < (b); i++) #define fori4(i, a, b, c) for (ll i = (a); ((c) > 0 || i > (b)) && ((c) < 0 || i < (b)); i += (c)) #define overload4(a, b, c, d, e, ...) e #define fori(...) overload4(__VA_ARGS__, fori4, fori3, fori2, fori1)(__VA_ARGS__) // declare and input // clang-format off #define INT(...) int __VA_ARGS__; inp(__VA_ARGS__); #define LL(...) ll __VA_ARGS__; inp(__VA_ARGS__); #define STRING(...) string __VA_ARGS__; inp(__VA_ARGS__); #define CHAR(...) char __VA_ARGS__; inp(__VA_ARGS__); #define DOUBLE(...) double __VA_ARGS__; STRING(str___); __VA_ARGS__ = stod(str___); #define VEC(T, A, n) vector<T> A(n); inp(A); #define VVEC(T, A, n, m) vector<vector<T>> A(n, vector<T>(m)); inp(A); // clang-format on // const value const ll MOD1 = 1000000007; const ll MOD9 = 998244353; const double PI = acos(-1); // other macro #if !defined(RIN__LOCAL) && !defined(INTERACTIVE) #define endl "\n" #endif #define spa ' ' #define len(A) ll(A.size()) #define all(A) begin(A), end(A) // function vector<char> stoc(string &S) { int n = S.size(); vector<char> ret(n); for (int i = 0; i < n; i++) ret[i] = S[i]; return ret; } string ctos(vector<char> &S) { int n = S.size(); string ret = ""; for (int i = 0; i < n; i++) ret += S[i]; return ret; } template <class T> auto min(const T &a) { return *min_element(all(a)); } template <class T> auto max(const T &a) { return *max_element(all(a)); } template <class T, class S> auto clamp(T &a, const S &l, const S &r) { return (a > r ? r : a < l ? l : a); } template <class T, class S> inline bool chmax(T &a, const S &b) { return (a < b ? a = b, 1 : 0); } template <class T, class S> inline bool chmin(T &a, const S &b) { return (a > b ? a = b, 1 : 0); } template <class T, class S> inline bool chclamp(T &a, const S &l, const S &r) { auto b = clamp(a, l, r); return (a != b ? a = b, 1 : 0); } template <typename T> T sum(vector<T> &A) { T tot = 0; for (auto a : A) tot += a; return tot; } template <typename T> vector<T> compression(vector<T> X) { sort(all(X)); X.erase(unique(all(X)), X.end()); return X; } // input and output namespace io { // __int128_t std::istream &operator>>(std::istream &is, __int128_t &value) { std::string str; is >> str; value = 0; int sign = 1; for (size_t i = 0; i < str.size(); i++) { if (i == 0 && str[i] == '-') { sign = -1; continue; } value = value * 10 + str[i] - '0'; } value *= sign; return is; } std::ostream &operator<<(std::ostream &dest, __int128_t value) { std::ostream::sentry s(dest); if (s) { __uint128_t tmp = value < 0 ? -value : value; char buffer[128]; char *d = std::end(buffer); do { --d; *d = "0123456789"[tmp % 10]; tmp /= 10; } while (tmp != 0); if (value < 0) { --d; *d = '-'; } int len = std::end(buffer) - d; if (dest.rdbuf()->sputn(d, len) != len) { dest.setstate(std::ios_base::badbit); } } return dest; } // vector<T> template <typename T> istream &operator>>(istream &is, vector<T> &A) { for (auto &a : A) is >> a; return is; } template <typename T> ostream &operator<<(ostream &os, vector<T> &A) { for (size_t i = 0; i < A.size(); i++) { os << A[i]; if (i != A.size() - 1) os << ' '; } return os; } // vector<vector<T>> template <typename T> istream &operator>>(istream &is, vector<vector<T>> &A) { for (auto &a : A) is >> a; return is; } template <typename T> ostream &operator<<(ostream &os, vector<vector<T>> &A) { for (size_t i = 0; i < A.size(); i++) { os << A[i]; if (i != A.size() - 1) os << endl; } return os; } // pair<S, T> template <typename S, typename T> istream &operator>>(istream &is, pair<S, T> &A) { is >> A.first >> A.second; return is; } template <typename S, typename T> ostream &operator<<(ostream &os, pair<S, T> &A) { os << A.first << ' ' << A.second; return os; } // vector<pair<S, T>> template <typename S, typename T> istream &operator>>(istream &is, vector<pair<S, T>> &A) { for (size_t i = 0; i < A.size(); i++) { is >> A[i]; } return is; } template <typename S, typename T> ostream &operator<<(ostream &os, vector<pair<S, T>> &A) { for (size_t i = 0; i < A.size(); i++) { os << A[i]; if (i != A.size() - 1) os << endl; } return os; } // tuple template <typename T, size_t N> struct TuplePrint { static ostream &print(ostream &os, const T &t) { TuplePrint<T, N - 1>::print(os, t); os << ' ' << get<N - 1>(t); return os; } }; template <typename T> struct TuplePrint<T, 1> { static ostream &print(ostream &os, const T &t) { os << get<0>(t); return os; } }; template <typename... Args> ostream &operator<<(ostream &os, const tuple<Args...> &t) { TuplePrint<decltype(t), sizeof...(Args)>::print(os, t); return os; } // io functions void FLUSH() { cout << flush; } void print() { cout << endl; } template <class Head, class... Tail> void print(Head &&head, Tail &&...tail) { cout << head; if (sizeof...(Tail)) cout << spa; print(std::forward<Tail>(tail)...); } template <typename T, typename S> void prisep(vector<T> &A, S sep) { int n = A.size(); for (int i = 0; i < n; i++) { cout << A[i]; if (i != n - 1) cout << sep; } cout << endl; } template <typename T, typename S> void priend(T A, S end) { cout << A << end; } template <typename T> void prispa(T A) { priend(A, spa); } template <typename T, typename S> bool printif(bool f, T A, S B) { if (f) print(A); else print(B); return f; } template <class... T> void inp(T &...a) { (cin >> ... >> a); } } // namespace io using namespace io; // read graph vector<vector<int>> read_edges(int n, int m, bool direct = false, int indexed = 1) { vector<vector<int>> edges(n, vector<int>()); for (int i = 0; i < m; i++) { INT(u, v); u -= indexed; v -= indexed; edges[u].push_back(v); if (!direct) edges[v].push_back(u); } return edges; } vector<vector<int>> read_tree(int n, int indexed = 1) { return read_edges(n, n - 1, false, indexed); } template <typename T = long long> vector<vector<pair<int, T>>> read_wedges(int n, int m, bool direct = false, int indexed = 1) { vector<vector<pair<int, T>>> edges(n, vector<pair<int, T>>()); for (int i = 0; i < m; i++) { INT(u, v); T w; inp(w); u -= indexed; v -= indexed; edges[u].push_back({v, w}); if (!direct) edges[v].push_back({u, w}); } return edges; } template <typename T = long long> vector<vector<pair<int, T>>> read_wtree(int n, int indexed = 1) { return read_wedges<T>(n, n - 1, false, indexed); } // yes / no namespace yesno { // yes inline bool yes(bool f = true) { cout << (f ? "yes" : "no") << endl; return f; } inline bool Yes(bool f = true) { cout << (f ? "Yes" : "No") << endl; return f; } inline bool YES(bool f = true) { cout << (f ? "YES" : "NO") << endl; return f; } // no inline bool no(bool f = true) { cout << (!f ? "yes" : "no") << endl; return f; } inline bool No(bool f = true) { cout << (!f ? "Yes" : "No") << endl; return f; } inline bool NO(bool f = true) { cout << (!f ? "YES" : "NO") << endl; return f; } // possible inline bool possible(bool f = true) { cout << (f ? "possible" : "impossible") << endl; return f; } inline bool Possible(bool f = true) { cout << (f ? "Possible" : "Impossible") << endl; return f; } inline bool POSSIBLE(bool f = true) { cout << (f ? "POSSIBLE" : "IMPOSSIBLE") << endl; return f; } // impossible inline bool impossible(bool f = true) { cout << (!f ? "possible" : "impossible") << endl; return f; } inline bool Impossible(bool f = true) { cout << (!f ? "Possible" : "Impossible") << endl; return f; } inline bool IMPOSSIBLE(bool f = true) { cout << (!f ? "POSSIBLE" : "IMPOSSIBLE") << endl; return f; } // Alice Bob inline bool Alice(bool f = true) { cout << (f ? "Alice" : "Bob") << endl; return f; } inline bool Bob(bool f = true) { cout << (f ? "Bob" : "Alice") << endl; return f; } // Takahashi Aoki inline bool Takahashi(bool f = true) { cout << (f ? "Takahashi" : "Aoki") << endl; return f; } inline bool Aoki(bool f = true) { cout << (f ? "Aoki" : "Takahashi") << endl; return f; } } // namespace yesno using namespace yesno; } // namespace templates using namespace templates; enum class DyConOpe { ADD_EDGE = 0, REMOVE_EDGE = 1, EVENT = 2, }; struct OfflineDynamicConnectivity { std::vector<std::pair<DyConOpe, int>> opes; int edge_cnt, event_cnt; std::vector<std::pair<int, int>> e_range; std::vector<bool> edge_exist; OfflineDynamicConnectivity(int Q) : edge_cnt(0), event_cnt(0) { opes.reserve(Q); e_range.reserve(Q); edge_exist.reserve(Q); } OfflineDynamicConnectivity() : OfflineDynamicConnectivity(0) {} int add_edge() { e_range.emplace_back(int(opes.size()), -1); opes.emplace_back(DyConOpe::ADD_EDGE, edge_cnt++); edge_exist.push_back(true); return edge_cnt - 1; } void remove_edge(int ei) { assert(ei < int(edge_exist.size())); assert(edge_exist[ei]); edge_exist[ei] = false; e_range[ei].second = int(opes.size()); opes.emplace_back(DyConOpe::REMOVE_EDGE, ei); } int add_event() { opes.emplace_back(DyConOpe::EVENT, event_cnt++); return event_cnt - 1; } std::vector<std::pair<DyConOpe, int>> build() { if (opes.empty()) return {}; int n0 = 1; int n = opes.size(); while (n0 < n) n0 <<= 1; std::vector<std::vector<int>> es(2 * n0); for (int ei = 0; ei < edge_cnt; ei++) { auto [l, r] = e_range[ei]; if (r == -1) r = n; l += n0; r += n0; while (l < r) { if (l & 1) { es[l++].push_back(ei); } if (r & 1) { es[--r].push_back(ei); } l >>= 1; r >>= 1; } } std::vector<bool> valid(2 * n0, false); for (int i = n0; i < n0 + n; i++) valid[i] = true; for (int i = n0 - 1; i >= 1; i--) { valid[i] = valid[2 * i]; } std::vector<std::pair<DyConOpe, int>> queries; std::stack<int> st; st.emplace(~1); st.emplace(1); while (!st.empty()) { int v = st.top(); st.pop(); if (v >= 0) { for (auto ei : es[v]) { queries.emplace_back(DyConOpe::ADD_EDGE, ei); } if (v >= n0) { if (opes[v - n0].first == DyConOpe::EVENT) { queries.emplace_back(DyConOpe::EVENT, opes[v - n0].second); } } else { if (valid[2 * v + 1]) { st.emplace(~(2 * v + 1)); st.emplace(2 * v + 1); } if (valid[2 * v]) { st.emplace(~(2 * v)); st.emplace(2 * v); } } } else { v = ~v; for (auto ei : es[v]) { queries.emplace_back(DyConOpe::REMOVE_EDGE, ei); } } } return queries; } }; template <typename T, typename V> struct HashMap { std::vector<T> key; std::vector<V> value; std::vector<bool> used; uint32_t mask; std::vector<T> keys; HashMap(int n = 0) { int s = 4; while (s < n) s <<= 1; key.resize(s); value.resize(s); used.resize(s); keys.reserve(s); mask = s - 1; } size_t size() { return keys.size(); } size_t hash(uint64_t x) { static const uint64_t FIXED_RANDOM = std::chrono::steady_clock::now().time_since_epoch().count(); x += FIXED_RANDOM; x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9ULL; x = (x ^ (x >> 27)) * 0x94d049bb133111ebULL; x = x ^ (x >> 31); return x & mask; } int index(const int64_t &x) { size_t i = hash(x); while (used[i] && key[i] != x) { i++; if (i == key.size()) i = 0; } return i; } void extend() { std::vector<V> values; values.reserve(keys.size()); for (auto k : keys) { values.push_back(get(k)); } int n = key.size(); key.resize(2 * n); value.resize(2 * n); used.assign(2 * n, false); keys.reserve(2 * n); mask = 2 * n - 1; for (size_t i = 0; i < keys.size(); i++) { auto k = index(keys[i]); used[k] = true; key[k] = keys[i]; value[k] = values[i]; } } V &operator[](const T &x) { if (keys.size() * 4 > key.size()) { extend(); } int i = index(x); if (!used[i]) { used[i] = true; keys.push_back(x); } key[i] = x; return value[i]; } V get(const T &x, const V &default_value = V()) { int i = index(x); return used[i] ? value[i] : default_value; } bool find(const T &x) { int i = index(x); return used[i]; } void clear() { keys.clear(); used.assign(used.size(), false); } }; void solve() { INT(n, m); VEC(Pii, edges, n); for (auto &[u, v] : edges) { u--; v--; } VEC(ll, A, n); map<Pii, int> e2idx; vec(Pii, events, 0); INT(Q); OfflineDynamicConnectivity G(m + Q); for (auto [u, v] : edges) { e2idx[{u, v}] = G.add_edge(); } fori(Q) { INT(t); if (t == 1) { INT(u, v); u--; v--; if (e2idx.count({u, v})) { G.remove_edge(e2idx[{u, v}]); e2idx.erase({u, v}); } else { e2idx[{u, v}] = G.add_edge(); edges.emplace_back(u, v); } } else if (t == 2) { INT(p, a); p--; G.add_event(); events.push_back({p, a}); } else { INT(c); c--; G.add_event(); events.push_back({-1, c}); } } vec(int, deg, n, 0); for (auto [u, v] : edges) { deg[u]++; deg[v]++; } vec(int, idx, n); iota(all(idx), 0); sort(all(idx), [&](int i, int j) { return deg[i] > deg[j]; }); int B = sqrt(n); chmin(B, n); vec(int, large, 0); vec(bool, is_large, n, false); fori(j, B) { int i = idx[j]; large.push_back(i); is_large[i] = true; } vec(ll, ans, n, 0); HashMap<ll, int> tf; vvec(int, adj, n); for (auto [u, v] : edges) { adj[u].push_back(v); adj[v].push_back(u); } fori(i, n) { adj[i] = compression(adj[i]); } for (auto [t, ei] : G.opes) { if (t == DyConOpe::ADD_EDGE) { auto [u, v] = edges[ei]; e2idx[{u, v}] = ei; if (!is_large[u]) { ans[v] += A[u]; } if (!is_large[v]) { ans[u] += A[v]; } tf[u * n + v] = true; } else if (t == DyConOpe::REMOVE_EDGE) { auto [u, v] = edges[ei]; e2idx.erase({u, v}); if (!is_large[u]) { ans[v] -= A[u]; } if (!is_large[v]) { ans[u] -= A[v]; } tf[u * n + v] = false; } else if (t == DyConOpe::EVENT) { auto [p, a] = events[ei]; if (p == -1) { ll x = ans[a]; for (auto i : large) { int key = i > a ? a * n + i : i * n + a; if (tf.get(key, false)) { x += A[i]; } } print(x); } else { if (!is_large[p]) { ll d = a - A[p]; for (auto i : adj[p]) { int key = i > p ? p * n + i : i * n + p; if (tf.get(key, false)) { ans[i] += d; } } } A[p] = a; } } } } int main() { #ifndef INTERACTIVE std::cin.tie(0)->sync_with_stdio(0); #endif // std::cout << std::fixed << std::setprecision(12); int t; t = 1; // std::cin >> t; while (t--) solve(); return 0; } // // #pragma GCC target("avx2") // // #pragma GCC optimize("O3") // // #pragma GCC optimize("unroll-loops") // // #define INTERACTIVE // // #include "kyopro-cpp/template.hpp" // // #include "graph/OfflineDynamicConnectivity.hpp" // #include "misc/HashMap.hpp" // // void solve() { // INT(n, m); // VEC(Pii, edges, n); // for (auto &[u, v] : edges) { // u--; // v--; // } // VEC(ll, A, n); // map<Pii, int> e2idx; // vec(Pii, events, 0); // INT(Q); // OfflineDynamicConnectivity G(m + Q); // for (auto [u, v] : edges) { // e2idx[{u, v}] = G.add_edge(); // } // fori(Q) { // INT(t); // if (t == 1) { // INT(u, v); // u--; // v--; // if (e2idx.count({u, v})) { // G.remove_edge(e2idx[{u, v}]); // e2idx.erase({u, v}); // } else { // e2idx[{u, v}] = G.add_edge(); // edges.emplace_back(u, v); // } // } else if (t == 2) { // INT(p, a); // p--; // G.add_event(); // events.push_back({p, a}); // } else { // INT(c); // c--; // G.add_event(); // events.push_back({-1, c}); // } // } // // vec(int, deg, n, 0); // for (auto [u, v] : edges) { // deg[u]++; // deg[v]++; // } // vec(int, idx, n); // iota(all(idx), 0); // sort(all(idx), [&](int i, int j) { return deg[i] > deg[j]; }); // int B = sqrt(n); // chmin(B, n); // vec(int, large, 0); // vec(bool, is_large, n, false); // fori(j, B) { // int i = idx[j]; // large.push_back(i); // is_large[i] = true; // } // // vec(ll, ans, n, 0); // HashMap<ll, int> tf; // vvec(int, adj, n); // for (auto [u, v] : edges) { // adj[u].push_back(v); // adj[v].push_back(u); // } // fori(i, n) { // adj[i] = compression(adj[i]); // } // // for (auto [t, ei] : G.opes) { // if (t == DyConOpe::ADD_EDGE) { // auto [u, v] = edges[ei]; // e2idx[{u, v}] = ei; // // if (!is_large[u]) { // ans[v] += A[u]; // } // if (!is_large[v]) { // ans[u] += A[v]; // } // tf[u * n + v] = true; // } else if (t == DyConOpe::REMOVE_EDGE) { // auto [u, v] = edges[ei]; // e2idx.erase({u, v}); // if (!is_large[u]) { // ans[v] -= A[u]; // } // if (!is_large[v]) { // ans[u] -= A[v]; // } // tf[u * n + v] = false; // } else if (t == DyConOpe::EVENT) { // auto [p, a] = events[ei]; // if (p == -1) { // ll x = ans[a]; // for (auto i : large) { // int key = i > a ? a * n + i : i * n + a; // if (tf.get(key, false)) { // x += A[i]; // } // } // print(x); // } else { // if (!is_large[p]) { // ll d = a - A[p]; // for (auto i : adj[p]) { // int key = i > p ? p * n + i : i * n + p; // if (tf.get(key, false)) { // ans[i] += d; // } // } // } // A[p] = a; // } // } // } // } // // int main() { // #ifndef INTERACTIVE // std::cin.tie(0)->sync_with_stdio(0); // #endif // // std::cout << std::fixed << std::setprecision(12); // int t; // t = 1; // // std::cin >> t; // while (t--) solve(); // return 0; // }