题意

\(N\)个点的树,边有边权。给\(M\)个询问,每个询问包含3个参数\(l,r,pos\),求标号在\(l\)到\(r\)中的所有点中,离节点pos最近的点到pos的距离。

分析:动态点分治+Treap

动态树分治。

把分治树给弄出来,用Treap以坐标为关键字,每个点存它在分治树的子树的所有节点到其距离。

这里不用再按照子树划分染色了,因为在同一个子树的点也不会影响结果。

其实用线段树就好了,只不过我傻了就用了Treap。

#define rep(i,a,b) for (int i=(a);i<=(b);i++)

#define pb push_back

#define mp make_pair
#define X first
#define Y second

typedef pair<int,int> PII;

const int N=131072;
const int S=4194304;
const int MAX=INT_MAX;
const int SEC_MAX=INT_MAX>>1;

int n;
vector<PII> g[N];

int vis[N];
int num,siz[N],gvt,gs;
vector<int> atc[N];

int rt[N],tot;
struct Tree {
    int lc,rc;
    int key,fix;
    int val,minVal;
    Tree(int _key=0,int _val=SEC_MAX) {
        lc=rc=0;
        key=_key,fix=rand();
        val=minVal=_val;
    }
}tr[S];
struct D {
    int lc,rc;
    D(void) {
        lc=rc=0;
    }
};

int m;

void Pushup(int x) {
    tr[x].minVal=min(tr[tr[x].lc].minVal,tr[tr[x].rc].minVal);
    tr[x].minVal=min(tr[x].minVal,tr[x].val);
}

int Merge(int x1,int x2) {
    if (!x1) return x2;
    if (!x2) return x1;
    if (tr[x1].fix<tr[x2].fix) {
        tr[x1].rc=Merge(tr[x1].rc,x2);
        Pushup(x1);
        return x1;
    }
    else {
        tr[x2].lc=Merge(x1,tr[x2].lc);
        Pushup(x2);
        return x2;
    }
}

D Split_Key(int x,int key) {
    D t; if (!x) return t;
    if (key<tr[x].key) {
        t=Split_Key(tr[x].lc,key);
        tr[x].lc=t.rc; Pushup(x);
        t.rc=x;
    }
    else {
        t=Split_Key(tr[x].rc,key);
        tr[x].rc=t.lc; Pushup(x);
        t.lc=x;
    }
    return t;
}

void Insert(int &rt,int x) {
    D t=Split_Key(rt,tr[x].key);
    rt=Merge(t.lc,x); rt=Merge(rt,t.rc);
}

void Add_Point(int god,int key,int dst) {
    tr[++tot]=Tree(key,dst);
    Insert(rt[god],tot);
}

int Query(int rt,int l,int r) {
    D t1=Split_Key(rt,l-1);
    D t2=Split_Key(t1.rc,r);
    int t=tr[t2.lc].minVal;
    rt=Merge(t2.lc,t2.rc); rt=Merge(t1.lc,rt);
    return t;
}

int Siz_DFS(int x,int fa) {
    siz[x]=1;
    rep(i,1,g[x].size()) {
        int nx=g[x][i-1].X;
        if (!vis[nx]&&nx!=fa) {
            int t=Siz_DFS(nx,x);
            siz[x]+=t;
        }
    }
    return siz[x];
}

void Find_Root(int x,int fa) {
    int t=num-siz[x];
    rep(i,1,g[x].size()) {
        int nx=g[x][i-1].X;
        if (!vis[nx]&&nx!=fa) {
            Find_Root(nx,x);
            t=max(t,siz[nx]);
        }
    }
    if (t<gs) {
        gs=t;
        gvt=x;
    }
}

void Link(int god,int x,int fa) {
    atc[x].pb(god);
    rep(i,1,g[x].size()) {
        int nx=g[x][i-1].X;
        if (!vis[nx]&&nx!=fa)
            Link(god,nx,x);
    }
}

void Add(int god,int x,int fa,int dst) {
    Add_Point(god,x,dst);
    rep(i,1,g[x].size()) {
        int nx=g[x][i-1].X,d=g[x][i-1].Y;
        if (!vis[nx]&&nx!=fa)
            Add(god,nx,x,dst+d);
    }
}

void Build(int frm) {
    num=Siz_DFS(frm,-1);
    gvt=0,gs=MAX; Find_Root(frm,-1);
    int x=gvt; vis[x]=1;

    Link(x,x,-1);
    Add(x,x,-1,0);

    rep(i,1,g[x].size()) {
        int nx=g[x][i-1].X;
        if (!vis[nx])
            Build(nx);
    }
}

int Min_Dist(int x,int l,int r) {
    int res=MAX;
    rep(i,1,atc[x].size()) {
        int nrt=atc[x][i-1];
        int d1=Query(rt[nrt],l,r);
        if (d1==SEC_MAX) continue;
        int d2=Query(rt[nrt],x,x);
        int t=d1+d2;
        res=min(res,t);
    }
    return res;
}

int main(void) {
    //...

    n=rd();
    rep(i,1,n-1) {
        int x=rd(),y=rd(),d=rd();
        g[x].pb(mp(y,d));
        g[y].pb(mp(x,d));
    }
    Build(1);

    int lst=0; m=rd();
    rep(i,1,m) {
        int l=rd(),r=rd(),pos=rd();
        pos^=lst;
        lst=Min_Dist(pos,l,r);
        printf("%d\n",lst);
    }

    //...
}

【xsy1230】树的更多相关文章

  1. 【xsy1230】 树(tree) 点分治+线段树

    题目大意:有一棵$n$个节点的树,点的标号为$1$到$n$.树中的边有边权.给你$m$个询问,每个询问包含三个参数$l,r,pos$,你要求出标号在$l$到$r$之间的所有点中,到节点$pos$距离最 ...

  2. B树——算法导论(25)

    B树 1. 简介 在之前我们学习了红黑树,今天再学习一种树--B树.它与红黑树有许多类似的地方,比如都是平衡搜索树,但它们在功能和结构上却有较大的差别. 从功能上看,B树是为磁盘或其他存储设备设计的, ...

  3. ASP.NET Aries 入门开发教程8:树型列表及自定义右键菜单

    前言: 前面几篇重点都在讲普通列表的相关操作. 本篇主要讲树型列表的操作. 框架在设计时,已经把树型列表和普通列表全面统一了操作,用法几乎是一致的. 下面介绍一些差距化的内容: 1:树型列表绑定: v ...

  4. 再讲IQueryable<T>,揭开表达式树的神秘面纱

    接上篇<先说IEnumerable,我们每天用的foreach你真的懂它吗?> 最近园子里定制自己的orm那是一个风生水起,感觉不整个自己的orm都不好意思继续混博客园了(开个玩笑).那么 ...

  5. HDU1671——前缀树的一点感触

    题目http://acm.hdu.edu.cn/showproblem.php?pid=1671 题目本身不难,一棵前缀树OK,但是前两次提交都没有成功. 第一次Memory Limit Exceed ...

  6. 算法与数据结构(十一) 平衡二叉树(AVL树)

    今天的博客是在上一篇博客的基础上进行的延伸.上一篇博客我们主要聊了二叉排序树,详情请戳<二叉排序树的查找.插入与删除>.本篇博客我们就在二叉排序树的基础上来聊聊平衡二叉树,也叫AVL树,A ...

  7. [C#] C# 知识回顾 - 表达式树 Expression Trees

    C# 知识回顾 - 表达式树 Expression Trees 目录 简介 Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译表达式树 执行表达式树 修改表达 ...

  8. bzoj3207--Hash+主席树

    题目大意: 给定一个n个数的序列和m个询问(n,m<=100000)和k,每个询问包含k+2个数字:l,r,b[1],b[2]...b[k],要求输出b[1]~b[k]在[l,r]中是否出现. ...

  9. bzoj1901--树状数组套主席树

    树状数组套主席树模板题... 题目大意: 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[ ...

随机推荐

  1. CentOS7安装配置SAMBA服务器

    假设我们有这样一个场景 共享名 路径 权限 SHAREDOC /smb/docs 所有人员包括来宾均可以访问 RDDOCS /smb/tech 仅允许特定组的用户进行读写访问 特定组的组名为RD,目前 ...

  2. Extjs 中column的renderer使用方法

    renderer: function(value, cellmeta, record, rowIndex, columnIndex, store) { if (record.get('productT ...

  3. 配置安卓运行环境/安卓sdk

    收藏一个网站 http://www.php100.com/html/webkaifa/Android/de_news/2013/0221/12082.html

  4. 一个iOS项目中包含多个xcodeproj文件,如何运行其中的一个项目

    从GitHub上下载的Masonry的iOS源码,打开发现有多个项目,直接运行,模拟器没反应.由于Masonry是一个多工程的项目,每个项目都依赖Masonry的源码,所以要运行Masonry的Exa ...

  5. 使用复合索引代替单键索引,来避免单键有null值的情况

    查看原表: SQL> select count(*) from t1; COUNT(*) ---------- 3229088 SQL> select count(*) from t1 w ...

  6. Dijkstar算法的数学原理

    Dijkstar算法是荷兰数学家迪克斯屈拉(or迪杰斯特拉?)在1959年发现的一个算法.是现有的几个求带权图中两个顶点之间最短通路的算法之一.算是一个相当经典的算法了. 迪克斯屈拉算法应用于无向连通 ...

  7. 初试FitNesse

    1.下载fitnesse-standalone.jar 2.在cmd中输入,开启fitnesse server 3.在浏览器中输入: 4.编写代码: package fitnesse.slim.tes ...

  8. MVC 4 异步编程简化了

    MVC 3 异步编程好麻烦,需要使用异步控制器,一个Action需要拆成两个,很不方便.MVC3的好处是,只需要.NET Framework 4.0就能运行 MVC 4 之后只需要使用async和aw ...

  9. 搭建android开发环境

    任何一个程序的开端都要从搭建开发环境开始,这样你就可以进行实战练习了,并且搭建完后即快速来一个项目HelloWorld, 哈哈,话不多说了,进入正题 android环境的安装主要分3步骤: 1.下载和 ...

  10. HTML5 UI框架Kendo UI Web教程:创建自定义组件(三)

    Kendo UI Web包 含数百个创建HTML5 web app的必备元素,包括UI组件.数据源.验证.一个MVVM框架.主题.模板等.在前面的2篇文章<HTML5 Web app开发工具Ke ...