FHVirus

TIOJ 1646

Apr 21st, 2021
262
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.80 KB | None | 0 0
  1. // Knapsack DP is harder than FFT.
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. typedef int64_t ll; typedef pair<int,int> pii; typedef pair<ll,ll> pll;
  5. #define ff first
  6. #define ss second
  7. #define pb emplace_back
  8. #define FOR(i,n) for(int i=0;i<(n);++i)
  9. #define FOO(i,a,b) for(int i=(a);i<=int(b);++i)
  10. #define OOF(i,a,b) for(int i=(a);i>=int(b);--i)
  11. #define AI(x) begin(x),end(x)
  12. template<class I>bool chmax(I&a,I b){return a<b?(a=b,true):false;}
  13. template<class I>bool chmin(I&a,I b){return b<a?(a=b,true):false;}
  14. inline ll cdiv(ll x,ll m){return x/m+(x%m?(x<0)^(m>0):0);}
  15. #ifdef OWO
  16. #define safe cerr<<"\033[1;32m"<<__PRETTY_FUNCTION__<<" - "<<__LINE__<<" JIZZ\033[0m\n"
  17. #define debug(args...) SDF(#args, args)
  18. #define OIU(args...) ostream& operator<<(ostream&O,args)
  19. #define LKJ(S,B,E,F) template<class...T>OIU(S<T...>s){O<<B;int c=0;for(auto i:s)O<<(c++?", ":"")<<F;return O<<E;}
  20. LKJ(vector,'[',']',i)LKJ(deque,'[',']',i)LKJ(set,'{','}',i)LKJ(multiset,'{','}',i)LKJ(unordered_set,'{','}',i)LKJ(map,'{','}',i.ff<<':'<<i.ss)LKJ(unordered_map,'{','}',i.ff<<':'<<i.ss)
  21. template<class T,size_t N>OIU(array<T,N>a){return O<<vector<T>(AI(a));}template<class...T>OIU(pair<T...>p){return O<<'('<<p.ff<<','<<p.ss<<')';}template<class...T>OIU(tuple<T...>t){return O<<'(',apply([&O](T...s){int c=0;(...,(O<<(c++?", ":"")<<s));},t),O<<')';}
  22. template<class...T>void SDF(const char* s,T...a){int c=sizeof...(T);if(!c){cerr<<"\033[1;32mvoid\033[0m\n";return;}(cerr<<"\033[1;32m("<<s<<") = (",...,(cerr<<a<<(--c?", ":")\033[0m\n")));}
  23. #else
  24. #pragma GCC optimize("Ofast")
  25. #define safe ((void)0)
  26. #define debug(...) ((void)0)
  27. #endif
  28. const ll inf = 1e9, INF = 4e18;
  29. const int N = 200002, L = 18;
  30. int n, r;
  31. int ri[N];
  32. vector<int> adj[N];
  33. vector<int> vir[N];
  34. vector<int> nds[N];
  35.  
  36. int dep[N], vis[N], tot;
  37. int st[L + 1][N * 2];
  38. void dfs(int u, int p){
  39.     vis[u] = tot++;
  40.     st[0][vis[u]] = u;
  41.     for(int v: adj[u]){
  42.         if(v == p) continue;
  43.         dep[v] = dep[u] + 1;
  44.         dfs(v, u);
  45.         st[0][tot++] = u;
  46.     }
  47. }
  48. void process(){
  49.     tot = 0;
  50.     dfs(1, 0);
  51.     for(int l = 1; l < L + 1; ++l)
  52.         for(int i = 0; i + (1<<l) < tot; ++i)
  53.             st[l][i] = (
  54.                 dep[st[l-1][i]] < dep[st[l-1][i + (1<<(l-1))]]
  55.                 ? st[l-1][i]
  56.                 : st[l-1][i + (1<<(l-1))]
  57.             );
  58. }
  59. int lca(int u, int v){
  60.     u = vis[u], v = vis[v];
  61.     if(u > v) swap(u, v);
  62.     int l = __lg(v - u);
  63.     return (
  64.         dep[st[l][u]] < dep[st[l][v - (1<<l) + 1]]
  65.         ? st[l][u]
  66.         : st[l][v - (1<<l) + 1]
  67.     );
  68. }
  69. int stk[N], top;
  70. void buildVir(vector<int>& nds){
  71.     sort(AI(nds), [](int u, int v){
  72.         return vis[u] < vis[v];
  73.     });
  74.     auto ae = [](int u, int v){
  75.         vir[u].pb(v);
  76.         vir[v].pb(u);
  77.     };
  78.     stk[top = 1] = 1; vir[1].clear();
  79.     for(int i: nds){
  80.         if(i == 1) continue;
  81.         int l = lca(i, stk[top]);
  82.         if(l != stk[top]){
  83.             while(vis[l] < vis[stk[top - 1]])
  84.                 ae(stk[top], stk[top - 1]), --top;
  85.             if(vis[l] > vis[stk[top - 1]]){
  86.                 vir[l].clear();
  87.                 ae(l, stk[top]);
  88.                 stk[top] = l;
  89.             } else ae(l, stk[top--]);
  90.         }
  91.         vir[i].clear();
  92.         stk[++top] = i;
  93.     }
  94.  
  95.     for(int i = 1; i < top; ++i)
  96.         ae(stk[i], stk[i + 1]);
  97. }
  98.  
  99. int curr;
  100. ll sz[N], dp[N];
  101. void dps(int u, int p){
  102.     sz[u] = (ri[u] == curr), dp[u] = 0;
  103.     for(int v: vir[u]){
  104.         if(v == p) continue;
  105.         dps(v, u);
  106.         dp[u] += sz[v] * sz[v] * (dep[v] - dep[u]);
  107.         dp[u] += dp[v];
  108.         sz[u] += sz[v];
  109.     }
  110. }
  111.  
  112. void solve(){
  113.     cin >> n >> r;
  114.     for(int i = 1; i <= r; ++i) nds[i].clear();
  115.     for(int i = 1; i <= n; ++i){
  116.         adj[i].clear();
  117.         cin >> ri[i];
  118.         nds[ri[i]].pb(i);
  119.     }
  120.     for(int i = 1, u, v; i < n; ++i){
  121.         cin >> u >> v;
  122.         adj[u].pb(v);
  123.         adj[v].pb(u);
  124.     }
  125.     process();
  126.     for(int i = 1; i <= r; ++i){
  127.         buildVir(nds[i]);
  128.         curr = i;
  129.         dps(1, 0);
  130.         cout << i << ": " << dp[1] << '\n';
  131.     }
  132.     cout << '\n';
  133. }
  134.  
  135. int32_t main(){
  136.     ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
  137.     int t; cin >> t;
  138.     for(; t; --t) solve();
  139.     return 0;
  140. }
  141.  
Add Comment
Please, Sign In to add comment