题意
给出一棵树,每次询问一个点$x$
到编号在$[l,r]$中的点的距离的最小值。
$n,q\le 10^5$

大概是最简单的动态点分治了,注意开大数组即可,如果改成求最大值这道题会有意思很多

代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
#define M 100010
#define ls ch[node][0]
#define rs ch[node][1]
using namespace std;
int n,m,num,cnt,root,S;
int head[M],son[M],sz[M],top[M],deep[M],fa[M],f[M],size[M],maxn[M],dis[M],rt[M];
int val[M<<],ch[M<<][];bool vis[M];
struct point{int to,next,dis;}e[M<<];
void add(int from,int to,int dis) {
e[++num].next=head[from];
e[num].to=to;
e[num].dis=dis;
head[from]=num;
}
void dfs1(int x) {
sz[x]=;deep[x]=deep[fa[x]]+;
for(int i=head[x];i;i=e[i].next) {
int to=e[i].to;
if(to==fa[x]) continue;
fa[to]=x,dis[to]=dis[x]+e[i].dis;
dfs1(to),sz[x]+=sz[to];
if(sz[son[x]]<sz[to]) son[x]=to;
}
}
void dfs2(int x,int tp) {
top[x]=tp;
if(son[x]) dfs2(son[x],tp);
for(int i=head[x];i;i=e[i].next)
if(e[i].to!=fa[x]&&e[i].to!=son[x])
dfs2(e[i].to,e[i].to);
}
int lca(int x,int y) {
while(top[x]!=top[y]) {
if(deep[top[x]]<deep[top[y]]) swap(x,y);
x=fa[top[x]];
}
return deep[x]<deep[y]?x:y;
}
int getdis(int x,int y) {
return dis[x]+dis[y]-*dis[lca(x,y)];
}
void getroot(int x,int fa) {
size[x]=;maxn[x]=;
for(int i=head[x];i;i=e[i].next) {
int to=e[i].to;
if(to==fa||vis[to]) continue;
getroot(to,x),size[x]+=size[to];
maxn[x]=max(maxn[x],size[to]);
}
maxn[x]=max(maxn[x],S-size[x]);
if(maxn[x]<maxn[root]) root=x;
}
void solve(int x,int ff) {
vis[x]=true,f[x]=ff;
for(int i=head[x];i;i=e[i].next) {
int to=e[i].to;
if(vis[to]) continue;
S=size[to],root=,getroot(to,);
solve(root,x);
}
}
void update(int node) {
if(ls) val[node]=min(val[node],val[ls]);
if(rs) val[node]=min(val[node],val[rs]);
}
void insert(int &node,int l,int r,int x,int v) {
if(!node) node=++cnt,val[node]=1e9;
if(l==r) {
val[node]=v;return;
}
int mid=(l+r)/;
if(x<=mid) insert(ls,l,mid,x,v);
else insert(rs,mid+,r,x,v);
update(node);
}
int query(int node,int l,int r,int l1,int r1) {
if(!node) return 1e9;
if(l1<=l&&r1>=r) return val[node];
int mid=(l+r)/,ans=1e9;
if(l1<=mid) ans=min(ans,query(ls,l,mid,l1,r1));
if(r1>mid) ans=min(ans,query(rs,mid+,r,l1,r1));
return ans;
}
void pushin(int x) {
for(int i=x;i;i=f[i])
insert(rt[i],,n,x,getdis(x,i));
}
int ask(int x,int l,int r) {
int ans=1e9;
for(int i=x;i;i=f[i])
ans=min(ans,getdis(x,i)+query(rt[i],,n,l,r));
return ans;
}
int main() {
scanf("%d",&n);
for(int i=;i<n;i++) {
int x,y,z;scanf("%d%d%d",&x,&y,&z);
add(x,y,z),add(y,x,z);
}
dfs1(),dfs2(,);
S=maxn[]=n,getroot(,),solve(root,);
for(int i=;i<=n;i++) pushin(i);
scanf("%d",&m);
for(int i=;i<=m;i++) {
int l,r,x;scanf("%d%d%d",&l,&r,&x);
printf("%d\n",ask(x,l,r));
}
return ;
}

[LOJ6145]Easy的更多相关文章

  1. 【loj6145】「2017 山东三轮集训 Day7」Easy 动态点分治+线段树

    题目描述 给你一棵 $n$ 个点的树,边有边权.$m$ 次询问,每次给出 $l$ .$r$ .$x$ ,求 $\text{Min}_{i=l}^r\text{dis}(i,x)$ . $n,m\le ...

  2. [LOJ6145][2017 山东三轮集训 Day7]Easy

    loj description 一棵树,每次给出\(l,r,x\),求从点\(x\)出发到达\([l,r]\)中任意一点的最短距离. sol 动态点分治. 建出点分树后,在每个节点上用以点编号为下标的 ...

  3. 【转】Windows下使用libsvm中的grid.py和easy.py进行参数调优

    libsvm中有进行参数调优的工具grid.py和easy.py可以使用,这些工具可以帮助我们选择更好的参数,减少自己参数选优带来的烦扰. 所需工具:libsvm.gnuplot 本机环境:Windo ...

  4. Struts2 easy UI插件

    一.easy UI是类似于jQuery UI的插件库,它提供了丰富的各种常用插件:tree.datagrid... tree插件: 语法:$(selector).tree([settings]); 常 ...

  5. Easy UI常用插件使用

    一.easy UI是类似于jQuery UI的插件库,它提供了丰富的各种常用插件:tree.datagrid... tree插件: 语法:$(selector).tree([settings]); 常 ...

  6. UVA-11991 Easy Problem from Rujia Liu?

    Problem E Easy Problem from Rujia Liu? Though Rujia Liu usually sets hard problems for contests (for ...

  7. CodeForces462 A. Appleman and Easy Task

    A. Appleman and Easy Task time limit per test 1 second memory limit per test 256 megabytes input sta ...

  8. easy ui插件

    简介: easy UI是类似于jQuery UI的插件库 注意:多脚本同时使用时,注意脚本冲突问题. 常用插件: 1.tree插件(tree插件实现动态树形菜单) 2.datagrid插件(datag ...

  9. 用TPP开启TDD的easy模式

    Test-Drived Development 测试驱动开发三步曲:写一个失败的测试用例->编写生产代码通过这个测试用例(transformation)->重构(refactor).重构是 ...

随机推荐

  1. hibernate中持久化对象的状态

    持久化对象有以下几种状态: 临时对象(Transient): 在使用代理主键的情况下,  OID 通常为 null  不处于 Session 的缓存中 在数据库中没有对应的记录 持久化对象(也叫”托管 ...

  2. Go语言 基本类型

    在内存中的形式 首先看一下在go中,一些基础类型在内存中是以什么形态存在的,如下图所示: 变量j的类型是int32, 而变量i的类型是int,两者不是同一个类型,所以赋值操作i=j是一种类型错误can ...

  3. C# ArcEngine 实现点击要素高亮并弹出其属性

    本文是模仿ArcMap里面的Identify(识别)功能,通过点击要素,使其高亮显示并弹出其属性表!本文只做了点击查询! 本文所用的环境为VS2010,AecEngine基于C#语言,界面是用Dev做 ...

  4. php中var_dump、var_export和print_r的用法区别

    void var_dump ( mixed $expression [, mixed $... ] )此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值.数组将递归展开值,通过缩进显示其结 ...

  5. SVN部署

    1.安装SVN yum install subversion –y 2.配置SVN 建立SVN版本库数据存储目录(svndata)及用户.密码权限目录(svnpasswd) mkdir -p /app ...

  6. UVA11426 GCD - Extreme (II)---欧拉函数的运用

    题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  7. Keywords Search---hdu2222(AC自动机 模板)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2222 一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过 ...

  8. Theme Section---hdu4763(kmp, Next数组的运用)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4763 题意就是求s串中满足EAEBE格式的E的最大长度:我们可以枚举前缀和后缀的所有匹配(k)看是否在 ...

  9. Wow! Such Doge!---hdu4847(字符串水题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4847 题意就是求给出的文章中共有多少个doge,不区分大小写直接用strstr做就可以了: #incl ...

  10. VirtualBox network / study environment setup for RHEL

    I re-visited the RHEL study material and setup the environment again, noted down the procedure. 1, c ...