Untitled
unknown
plain_text
a year ago
3.3 kB
1
Indexable
#include "bits/stdc++.h" using namespace std; #ifdef LOCAL #include "debug.h" #else #define debug(x...) #endif constexpr int K = 5; constexpr int N = 1e5; int dp[K][N]; vector <int> g[300010]; vector <int> v; int n, m; int stupSolve() { int ans = 0; for (int i = 0; i < n; i++) { for (int &u : g[i]) { ans += (v[u] != v[i]); } } return ans / 2; } void solve() { //cin >> n >> m; n = 10; m = 20; v.resize(n); for (int i = 0; i < n; i++) g[i].clear(); for (int &i : v) { //cin >> i; i = rand() % 10 + 1; i--; } int ans = 0; for (int i = 0; i < m; i++) { int a, b; //cin >> a >> b; a = rand() % n + 1; b = rand() % n + 1; while (b == a) b = rand() % n + 1; a--; b--; if (v[a] != v[b]) { ans++; } g[a].push_back(b); g[b].push_back(a); } auto is_heavy = [&](int a) { return (int)g[a].size() >= K; }; int cur = 0; int mp[n]; for (int i = 0; i < n; i++) { sort(g[i].begin(), g[i].end(), [&](int lhs, int rhs) { return g[lhs].size() > g[rhs].size(); }); if (is_heavy(i)) { mp[i] = cur++; fill(dp[mp[i]], dp[mp[i]] + N, 0); } } for (int i = 0; i < n; i++) { if (is_heavy(i)) { for (int &u : g[i]) { if (!is_heavy(u)) { dp[mp[i]][v[u]]++; } } } } int q; //cin >> q; while (q--) { int C, V; //cin >> C >> V; C = rand() % n + 1; V = rand() % 20 + 1; C--; V--; if (v[C] == V) { //cout << ans << " " << stupSolve() << '\n'; if (ans != stupSolve()) cout << "FAIL" << endl; continue; } if (!is_heavy(C)) { for (int &u : g[C]) { if (!is_heavy(u)) { if (v[u] == v[C]) { ans++; } if (v[u] == V) { ans--; } } else { dp[mp[u]][v[C]]--; dp[mp[u]][V]++; if (v[u] == v[C]) { ans++; } if (v[u] == V) { ans--; } } } } else { for (int &u : g[C]) { if (!is_heavy(u)) break; if (v[u] == v[C]) { ans++; } if (v[u] == V) { ans--; } } ans -= dp[mp[C]][v[C]]; ans += dp[mp[C]][V]; } v[C] = V; //stupSolve(); if (ans != stupSolve()) cout << "FAIL" << endl; //cout << ans << " " << stupSolve() << '\n'; } } int main() { //ios::sync_with_stdio(false); //cin.tie(NULL); int tests = 1000; // cin >> tests; while (tests--) { solve(); } return 0; }