题意
给出一棵树,每次询问一个点$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. CentOS7.2编译配置LNMP环境(MySQL5.7.20,PHP7.0.24)

    一,     查看系统版本及内核版本 二,     编译安装nginx 1,          新建nginx用户 useradd -s /sbin/nologin -M nginx 2,       ...

  2. gdb常见命令(未完,待续)

    // 编译文件时,带参-g > gcc -g test.c // 进入gdb调试界面 > gdb a.out 或者 > gdb > file a.out // 查看文件内容 & ...

  3. POJ3272 Cow Traffic

    题目链接:http://poj.org/problem?id=3272 题目意思:n个点m条边的有向图,从所有入度为0的点出发到达n,问所有可能路径中,经过的某条路的最大次数是多少.边全是由标号小的到 ...

  4. RTB的颠覆性在于广告位不再是广告交易的标的,广告受众才是

    2014-09-15 PMP私有交易市场——程序化广告的新高度 | 互联网分析在中国——从基础到前沿 http://www.chinawebanalytics.cn/pmp-new-level-of- ...

  5. Chandy-Lamport_algorithm

    Chandy-Lamport algorithm - Wikipedia https://en.m.wikipedia.org/wiki/Chandy-Lamport_algorithm 经典快照算法 ...

  6. 策略(strategy)模式

    Head First一书中对于策略(strategy)模式的正式定义是:策略模式定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户. 为了介绍这个算法,书中讲了 ...

  7. git 常用文件目录介绍

    生成的RSA公钥与密钥目录: C:\Users\***\.ssh   系统配置文件路径 C:\ProgramData\Git\ C:\Program Files\Git\mingw64\etc   全 ...

  8. qemu进程页表和EPT的同步问题

    背景分析: 在之前分析EPT violation的时候,没有太注意qemu进程页表和EPT的关系,从虚拟机运行过程分析,虚拟机访存使用自身页表和EPT完成地址转换,没有用到qemu进程页表,所以也就想 ...

  9. (转)spring mvc forward与redirect

    forward 转发,如return "forward:/hello"; 浏览器的地址栏不会变,但是有视图返回来 redirect 重定向,如return "redire ...

  10. python16_day20【Django_继续抽屉项目】

    一.djangoAdmin和表结构 1.项目名称 python manage startapp web # 前端页面 python manage startapp repository   # 只是数 ...