Advertisement
Guest User

election

a guest
Feb 25th, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.60 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. void read(int &x)
  5. { scanf("%d", &x); }
  6. void write(int x)
  7. { printf("%d", x); }
  8. void maximize(int &a, int b)
  9. { a = max(a, b); }
  10.  
  11. const int N = 1e5 + 10;
  12. const int Nlog = 17;
  13. const int inf = 1e9 + 7;
  14.  
  15. int n, Q;
  16. vector<int > adj[N];
  17. struct QUERY { int u, v, c; } queri[N];
  18.  
  19. vector<pair<int, int > > listOfLCA[N];
  20. vector<int > listOfQueri[N];
  21.  
  22. struct LowestCommonAncestor {
  23.     int dad[N][Nlog];
  24.     int dep[N];
  25.  
  26.     void dfs(int u, int papa){
  27.         for (int v : adj[u])
  28.             if (v == papa) continue;
  29.             else
  30.                 dad[v][0] = u,
  31.                 dep[v] = dep[u] + 1,
  32.                 dfs(v, u);
  33.     }
  34.  
  35.     void build(){
  36.         dep[1] = 1;
  37.         dfs(1, 0);
  38.         for (int j = 1; j < Nlog; j++)
  39.             for (int i = 1; i <= n; i++)
  40.                 dad[i][j] = dad[ dad[i][j - 1] ][ j - 1 ];
  41.     }
  42.  
  43.     int getLCA(int u, int v){
  44.         if (dep[u] < dep[v]) swap(u, v);
  45.         for (int i = Nlog - 1; i >= 0; i--)
  46.             if (dep[ dad[u][i] ] >= dep[v]) u = dad[u][i];
  47.         if (u == v) return u; assert(dep[u] == dep[v]);
  48.         for (int i = Nlog - 1; i >= 0; i--)
  49.             if (dad[u][i] != dad[v][i])
  50.                 u = dad[u][i],
  51.                 v = dad[v][i];
  52.         return dad[u][0];
  53.     }
  54.  
  55.     int dadKth(int u, int dist){
  56.         if (dist < 0) return u;
  57.         for (int jump = Nlog - 1; jump >= 0; jump--)
  58.             if (dist & (1 << jump))
  59.             u = dad[u][jump];
  60.         return u;
  61.     }
  62.  
  63. } LCA;
  64.  
  65. void init(){
  66.     LCA.build();
  67.     for (int i = 1; i <= n; i++)
  68.         for (int j = 0; j < Nlog; j++)
  69.             listOfLCA[ LCA.dad[i][j] ] . push_back({i, j});
  70.     for (int i = 1; i <= Q; i++){
  71.         int lca = LCA.getLCA(queri[i].u, queri[i].v);
  72.         listOfQueri[lca].push_back(i);
  73.     }
  74. }
  75.  
  76. struct DynamicProgramming{
  77.     int F[N][2];
  78.     int specSum[N][Nlog];
  79.  
  80.     int getMax(int u)
  81.     { return max(F[u][0], F[u][1]); }
  82.  
  83.     int getSumSpecRange(int u, int v){
  84.         if (LCA.dep[u] < LCA.dep[v]) return -inf;
  85.         int ans = 0;
  86.         for (int jump = Nlog - 1; jump >= 0; jump--)
  87.         if (LCA.dep [ LCA.dad[u][jump] ] >= LCA.dep[v]){
  88.             ans += specSum[u][jump];
  89.             u = LCA.dad[u][jump];
  90.         }
  91.         return ans;
  92.     }
  93.  
  94.     void dfs(int u, int papa){
  95.         for (int v : adj[u])
  96.             if (v == papa) continue;
  97.             else {
  98.                 dfs(v, u);
  99.                 F[u][0] += getMax(v);
  100.             }
  101.         // update Dp   
  102.         for (int queriIndex : listOfQueri[u]){
  103.             int qu = queri[queriIndex].u,
  104.                 qv = queri[queriIndex].v,
  105.                 qc = queri[queriIndex].c;
  106.             if (LCA.dep[qu] < LCA.dep[qv]) swap(qu, qv);
  107.             // qu nam o duoi qv
  108.             int lca = LCA.getLCA(qu, qv);
  109.             int preLCA1 = LCA.dadKth(qu, LCA.dep[qu] - LCA.dep[lca] - 1);
  110.             int preLCA2 = LCA.dadKth(qv, LCA.dep[qv] - LCA.dep[lca] - 1);
  111.             if (lca != qv){
  112.                 maximize(F[u][1], qc + F[u][0] - getMax(preLCA1) - getMax(preLCA2) +
  113.                     getSumSpecRange(qu, preLCA1) + getSumSpecRange(qv, preLCA2) + F[qu][0] + F[qv][0]);
  114.             }
  115.             else{
  116.                 maximize(F[u][1], qc + F[u][0] - getMax(preLCA1) +
  117.                     getSumSpecRange(qu, preLCA1) + F[qu][0]);
  118.             }
  119.         }
  120.         // update SpecSum
  121.         for (pair<int, int > lcaInformation : listOfLCA[u]){
  122.             int jump = lcaInformation.second,
  123.                 descendant = lcaInformation.first;
  124.             if (jump == 0) specSum[descendant][jump] = F[u][0] - getMax(descendant);
  125.             else
  126.             specSum[descendant][jump] =
  127.                 specSum[descendant][jump - 1] + specSum[ LCA.dad[descendant][jump - 1] ] [ jump - 1];
  128.         }
  129.     }
  130.  
  131.     void build(){
  132.         dfs(1, 0);
  133.     }
  134. } DP;
  135.  
  136. void solve(){
  137.     DP.build();
  138.     write(DP.getMax(1));
  139. }
  140.  
  141. main(){
  142.     freopen("election.in", "r", stdin);
  143.     freopen("election.out", "w", stdout);
  144.  
  145.     read(n);
  146.     for (int i = 1; i < n; i++){
  147.         int a, b; read(a); read(b);
  148.         adj[a].push_back(b);
  149.         adj[b].push_back(a);
  150.     }
  151.     read(Q);
  152.     for (int i = 1; i <= Q; i++)
  153.         read(queri[i].u),
  154.         read(queri[i].v),
  155.         read(queri[i].c);
  156.  
  157.     init();
  158.     solve();
  159. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement