[LOJ6145]Easy
题意
给出一棵树,每次询问一个点$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的更多相关文章
- 【loj6145】「2017 山东三轮集训 Day7」Easy 动态点分治+线段树
题目描述 给你一棵 $n$ 个点的树,边有边权.$m$ 次询问,每次给出 $l$ .$r$ .$x$ ,求 $\text{Min}_{i=l}^r\text{dis}(i,x)$ . $n,m\le ...
- [LOJ6145][2017 山东三轮集训 Day7]Easy
loj description 一棵树,每次给出\(l,r,x\),求从点\(x\)出发到达\([l,r]\)中任意一点的最短距离. sol 动态点分治. 建出点分树后,在每个节点上用以点编号为下标的 ...
- 【转】Windows下使用libsvm中的grid.py和easy.py进行参数调优
libsvm中有进行参数调优的工具grid.py和easy.py可以使用,这些工具可以帮助我们选择更好的参数,减少自己参数选优带来的烦扰. 所需工具:libsvm.gnuplot 本机环境:Windo ...
- Struts2 easy UI插件
一.easy UI是类似于jQuery UI的插件库,它提供了丰富的各种常用插件:tree.datagrid... tree插件: 语法:$(selector).tree([settings]); 常 ...
- Easy UI常用插件使用
一.easy UI是类似于jQuery UI的插件库,它提供了丰富的各种常用插件:tree.datagrid... tree插件: 语法:$(selector).tree([settings]); 常 ...
- UVA-11991 Easy Problem from Rujia Liu?
Problem E Easy Problem from Rujia Liu? Though Rujia Liu usually sets hard problems for contests (for ...
- 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 ...
- easy ui插件
简介: easy UI是类似于jQuery UI的插件库 注意:多脚本同时使用时,注意脚本冲突问题. 常用插件: 1.tree插件(tree插件实现动态树形菜单) 2.datagrid插件(datag ...
- 用TPP开启TDD的easy模式
Test-Drived Development 测试驱动开发三步曲:写一个失败的测试用例->编写生产代码通过这个测试用例(transformation)->重构(refactor).重构是 ...
随机推荐
- CentOS7.2编译配置LNMP环境(MySQL5.7.20,PHP7.0.24)
一, 查看系统版本及内核版本 二, 编译安装nginx 1, 新建nginx用户 useradd -s /sbin/nologin -M nginx 2, ...
- gdb常见命令(未完,待续)
// 编译文件时,带参-g > gcc -g test.c // 进入gdb调试界面 > gdb a.out 或者 > gdb > file a.out // 查看文件内容 & ...
- POJ3272 Cow Traffic
题目链接:http://poj.org/problem?id=3272 题目意思:n个点m条边的有向图,从所有入度为0的点出发到达n,问所有可能路径中,经过的某条路的最大次数是多少.边全是由标号小的到 ...
- RTB的颠覆性在于广告位不再是广告交易的标的,广告受众才是
2014-09-15 PMP私有交易市场——程序化广告的新高度 | 互联网分析在中国——从基础到前沿 http://www.chinawebanalytics.cn/pmp-new-level-of- ...
- Chandy-Lamport_algorithm
Chandy-Lamport algorithm - Wikipedia https://en.m.wikipedia.org/wiki/Chandy-Lamport_algorithm 经典快照算法 ...
- 策略(strategy)模式
Head First一书中对于策略(strategy)模式的正式定义是:策略模式定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户. 为了介绍这个算法,书中讲了 ...
- git 常用文件目录介绍
生成的RSA公钥与密钥目录: C:\Users\***\.ssh 系统配置文件路径 C:\ProgramData\Git\ C:\Program Files\Git\mingw64\etc 全 ...
- qemu进程页表和EPT的同步问题
背景分析: 在之前分析EPT violation的时候,没有太注意qemu进程页表和EPT的关系,从虚拟机运行过程分析,虚拟机访存使用自身页表和EPT完成地址转换,没有用到qemu进程页表,所以也就想 ...
- (转)spring mvc forward与redirect
forward 转发,如return "forward:/hello"; 浏览器的地址栏不会变,但是有视图返回来 redirect 重定向,如return "redire ...
- python16_day20【Django_继续抽屉项目】
一.djangoAdmin和表结构 1.项目名称 python manage startapp web # 前端页面 python manage startapp repository # 只是数 ...