//Accepted    11676 KB    2344 ms
/*
    source:poj2763
    time  :2015.5.29
    by    :songt
  */
/*题解:
树链剖分
基于边权,路径查询
wind第一次在s节点,假如她走到了p节点,那么下次开始的时候他就在p节点
  */
#include <cstdio>
#include <cstring>

;
struct Edge
{
    int u,v;
    Edge(){}
    Edge(int u,int v):u(u),v(v){}
}edge[*imax_n];
int head[imax_n];
*imax_n];
int tot;
void addEdge(int u,int v)
{
    edge[tot]=Edge(u,v);
    next[tot]=head[u];
    head[u]=tot++;
}
int fa[imax_n],deep[imax_n],num[imax_n],son[imax_n];
int p[imax_n],fp[imax_n],top[imax_n];
int pos;
void init()
{
    memset(head,-,sizeof(head));
    memset(next,-,sizeof(next));
    tot=;
    memset(son,-,sizeof(son));
    pos=;
}
int s[imax_n];
int cnt_s;
int vis[imax_n];
void dfs1(int u)
{
    fa[u]=;
    deep[u]=;
    cnt_s=;
    s[cnt_s++]=u;
    memset(vis,,sizeof(vis));
    while (cnt_s)
    {
        ];
        if (vis[x])
        {
            cnt_s--;
            if (x!=u)
            {
                num[fa[x]]+=num[x];
                 || num[fa[x]]<num[x])
                    son[fa[x]]=x;
            }
            continue;
        }
        vis[x]=;
        num[x]=;
        ;i=next[i])
        {
            int v=edge[i].v;
            if (v!=fa[x])
            {
                fa[v]=x;
                deep[v]=deep[x]+;
                s[cnt_s++]=v;
            }
        }
    }
}
void dfs2(int u)
{
    top[u]=u;
    memset(vis,,sizeof(vis));
    cnt_s=;
    s[cnt_s++]=u;
    while (cnt_s)
    {
        ];
        if (vis[x])
        {
            cnt_s--;
            continue ;
        }
        vis[x]=;
        p[x]=pos++;
        fp[p[x]]=x;
        ) continue ;
        ;i=next[i])
        {
            int v=edge[i].v;
            if (v!=fa[x] && v!=son[x])
            {
                top[v]=v;
                s[cnt_s++]=v;
            }
        }
        top[son[x]]=top[x];
        s[cnt_s++]=son[x];
    }
}
struct Tree
{
    int l,r;
    long long sum;
}f[imax_n*];
void build(int t,int l,int r)
{
    f[t].l=l;
    f[t].r=r;
    f[t].sum=;
    if (l==r)
    {
        return ;
    }
    ;
    build(*t,l,mid);
    build(*t+,mid+,r);
}
void update(int t,int k,int value)
{
    if (f[t].l==k && f[t].r==k)
    {
        f[t].sum=value;
        return ;
    }
    ;
    *t,k,value);
    *t+,k,value);
    f[t].sum=f[*t].sum+f[*t+].sum;
}
long long query(int t,int l,int r)
{
    if (f[t].l==l && f[t].r==r)
    {
        return f[t].sum;
    }
    ;
    *t,l,r);
    else
    {
        *t+,l,r);
        *t,l,mid)+query(*t+,mid+,r);
    }
}
void swap(int &a,int &b)
{
    int t=a;
    a=b;
    b=t;
}
long long find(int u,int v)
{
    int f1=top[u],f2=top[v];
    ;
    while (f1!=f2)
    {
        if (deep[f1]<deep[f2])
        {
            swap(f1,f2);
            swap(u,v);
        }
        sum+=query(,p[f1],p[u]);
        u=fa[f1];
        f1=top[u];
    }
    if (u==v) return sum;
    if (deep[u]>deep[v]) swap(u,v);
    sum+=query(,p[son[u]],p[v]);
    return sum;
}
];
int n,m;
int res;

int main()
{
    )
    //scanf("%d%d%d",&n,&m,&res);
    {
        init();
        ;i<n-;i++)
        {
            scanf(],&e[i][],&e[i][]);
            addEdge(e[i][],e[i][]);
            addEdge(e[i][],e[i][]);
        }
        dfs1();
        dfs2();
        build(,,pos-);
        ;i<n-;i++)
        {
            ]]<deep[e[i][]]) swap(e[i][],e[i][]);
            update(,p[e[i][]],e[i][]);
        }
        int kind;
        int u,v;
        ;i<m;i++)
        {
            scanf("%d",&kind);
            )
            {
                scanf("%d",&u);
                printf("%lld\n",find(u,res));
                res=u;
            }
            else
            {
                scanf("%d%d",&u,&v);
                update(,p[e[u-][]],v);
            }
        }
    }
    ;
}

poj2763的更多相关文章

  1. 【lct】poj2763 Housewife Wind

    题意:给你一棵树,边带权,支持两种操作:修改某条边的权值:查询两点之间的最短路. lct主要实现单点修改和路径和. 修改x结点的值只需将x Splay到其所在辅助树的根,然后修改其值,再maintai ...

  2. poj2763(树链剖分 - 边权)

    poj2763 题意 给定一个树形图,某人原来在 s 点,每条边(路)有通过的时间花费,有两种操作:1. 查询某人到 u 点花费的时间 2. 更新某条路的时间花费. 分析 权值在边上,可以把它们 &q ...

  3. POJ2763 Housewife Wind 树链剖分 边权

    POJ2763 Housewife Wind 树链剖分 边权 传送门:http://poj.org/problem?id=2763 题意: n个点的,n-1条边,有边权 修改单边边权 询问 输出 当前 ...

  4. POJ2763 Housewife Wind

      Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 9701   Accepted: 2661 Description Aft ...

  5. poj2763 树链剖分(线段树)

    注意这里都是把边放到线段树中,所以lca的时候,要注意如果top[x]==top[y] && x==y 的时候已经完成了. 仔细想想边和点的不同之处!!! #include<ma ...

  6. POJ2763 Housewife Wind(DFS序)

    题目:单边修改,树链查询. 这题是边权,不是点权,不过也可以看作是点权. 然后其实就和BZOJ2819一样. #include<cstdio> #include<cstring> ...

  7. poj2763(树链剖分)

    题目链接:http://poj.org/problem?id=2763 题意:定一棵带边权的树,要求支持两种操作:1)询问树中某两点间的距离. 2)修改某条边的权值. 分析:树链剖分,边权修改,路径求 ...

  8. 树链剖分——边权poj2763

    边权操作起来也和点权一样,只要把边的权值映射到点上即可,要注意的地方是向上爬的过程中和点权不太一样,还有个特判(WA了几次..) 完整代码 #include<cstring> #inclu ...

  9. poj2763树链剖分边权+区间和

    自己写的比原来的板子常数小了不少嘻嘻,边权处理起来比点权要复杂一下 由于根节点没有被映射的边,其被访问到的顺序是0,直接排除在线段树外 #include<iostream> #includ ...

随机推荐

  1. linux 系统下 ngnix 显示目录形式

    vi  /usr/local/nginx/conf/nginx.conf   #编辑配置文件,在server {下面添加以下内容: location  / { autoindex on; autoin ...

  2. phpstorm使用手册

    参考:http://www.cnblogs.com/luojianqun/p/4596052.html 罗总说这是php最好的IDE,phpstorm9.02,没有之一.各种功能各种好,罗总此等大神说 ...

  3. web api+递归树型结构

    using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Ne ...

  4. SPSS数据分析—广义线性模型

    我们前面介绍的一般线性模型.Logistic回归模型.对数线性模型.Poisson回归模型等,实际上均属于广义线性模型的范畴,广义 线性模型包含的范围非常广泛,原因在于其对于因变量.因变量的概率分布等 ...

  5. SQL Server Management Studio 已停止工作 异常错误

    找到类似环境下sql的路径 D:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\ 复制出 Ss ...

  6. UEditor-从客户端(editorValue="<p>asd</p>")中检测到有潜在危险的 Request.Form 值。

    在用富文本编辑器时经常会遇到的问题是asp.net报的”检测到有潜在危险的 Request.Form 值“一般的解法是在aspx页面   page  标签中加上 validaterequest='fa ...

  7. 获取checkbox后面的文本内容

    http://alygle.blog.51cto.com/1922399/669040 <head> <meta http-equiv="Content-Type" ...

  8. opencv 小任务1 图片的缩放

    #include <opencv2/opencv.hpp> using namespace std; int main() { double fScale = 0.2; //缩放倍数 Cv ...

  9. 分治法解决合并排序(c++和Java源代码)

    Java源代码 public class Mergesort1 { public static void merge(int[]a,int low,int mid,int high){//对两组已经排 ...

  10. FastReport4.6 组件安装

    要完整版不是官方版的试用版.下面包括有的文件 安装前请册除原有的FR控件. 1. "Tools|Environmet options..."中的"Library" ...