zoukankan      html  css  js  c++  java
  • 树链剖分

     1 #include <cstdio>
     2 #include <algorithm>
     3 #include <cstring>
     4 using namespace std;
     5 
     6 const int maxn = 1e5+7;
     7 
     8 int siz[maxn],dep[maxn],top[maxn],tid[maxn],ran[maxn],fa[maxn],son[maxn];
     9 int tot ,kkk ,head[maxn];
    10 
    11 struct node{
    12     int to,next;
    13 }EE[maxn*10];
    14 
    15 void add_edge(int u,int v){
    16     EE[kkk].to=v;EE[kkk].next=head[u];head[u]=kkk++;
    17 }
    18 
    19 void init(){
    20     memset(head,-1,sizeof(head));
    21     kkk = 0;
    22     tot = 0;
    23 }
    24 
    25 void dfs1(int x,int u,int d){
    26     siz[x] = 1;
    27     son[x] = -1;
    28     dep[x] = d;
    29     fa[x] = u;
    30     for(int i=head[x];i!=-1;i=EE[i].next){
    31         int to = EE[i].to;
    32         if(to != fa[x]){
    33             dfs1(to,x,d+1);
    34             siz[x] += siz[to];
    35             if(son[x] == -1 || siz[to] > siz[son[x]])
    36                 son[x] = to;
    37         }
    38     }
    39 }
    40 void dfs2(int x,int u){
    41     top[x] = u;
    42     tid[x] = ++tot;
    43     ran[tot] = x;
    44     if(son[x] != -1) dfs2(son[x],u);
    45     for(int i=head[x];i!=-1;i=EE[i].next){
    46         int to = EE[i].to;
    47         if(to != son[x] && to != fa[x])
    48             dfs2(to,to);
    49     }
    50 }
    51 
    52 void update(int x,int y){
    53     while(top[x] != top[y]){
    54         if(dep[top[x]] < dep[top[y]]) swap(x,y);
    55         tre.update(1,tid[top[x]],tid[x]);
    56         x = fa[top[x]];
    57     }
    58     if(dep[x] > dep[y]) swap(x,y);
    59     if(x != y) tre.update(1,tid[son[x]],tid[y]);//给定边权值
    60     ///tre.update(1,tid[x],tid[y]); //给节点权值
    61 }
    62 
    63 int query(int x,int y){
    64     int sum = -1e9-7;
    65     while(top[x] != top[y]){
    66         if(dep[top[x]] < dep[top[y]]) swap(x,y);
    67         sum = max(sum,tre.query(1,tid[top[x]],tid[x]));
    68         x = fa[top[x]];
    69     }
    70     if(dep[x] > dep[y]) swap(x,y);
    71     if(x != y) sum = max(sum,tre.query(1,tid[son[x]],tid[y]));//给边权值
    72     ///sum = max(sum,tre.query(1,tid[x],tid[y]));//给节点权值
    73     return sum;
    74 }
  • 相关阅读:
    MAVEN学习笔记之私服Nexus(2)
    MAVEN学习笔记之基础(1)
    mybatis 高级映射和spring整合之逆向工程(7)
    IPC之共享内存
    IPC之SystemV
    IPC之消息队列
    IPC之信号量
    线程同步
    线程函数
    线程基础
  • 原文地址:https://www.cnblogs.com/yZiii/p/7348870.html
Copyright © 2011-2022 走看看