「2017 山东三轮集训 Day7」Easy

练习一下动态点分

每个点开一个线段树维护子树到它的距离

然后随便查询一下就可以了

注意线段树开大点...


Code:

#include <cstdio>
#include <cctype>
#include <algorithm>
using std::min;
template <class T>
void read(T &x)
{
x=0;char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) x=x*10+c-'0',c=getchar();
}
const int N=1e5+10;
const int inf=0x3f3f3f3f;
int head[N],to[N<<1],Next[N<<1],edge[N<<1],cnt;
void add(int u,int v,int w)
{
to[++cnt]=v,edge[cnt]=w,Next[cnt]=head[u],head[u]=cnt;
}
namespace RMQLCA
{
int st[19][N<<1],Log[N<<1],dfn[N],dep[N],dis[N],clock;
void dfs(int now,int fa)
{
dep[now]=dep[fa]+1;
st[0][++clock]=now;
dfn[now]=clock;
for(int v,i=head[now];i;i=Next[i])
if((v=to[i])!=fa)
dis[v]=dis[now]+edge[i],dfs(v,now),st[0][++clock]=now;
}
void init()
{
dfs(1,0);
for(int i=2;i<=clock;i++) Log[i]=Log[i>>1]+1;
for(int j=1;j<=18;j++)
for(int i=1;i<=clock-(1<<j)+1;i++)
{
int x=st[j-1][i],y=st[j-1][i+(1<<j-1)];
st[j][i]=dep[x]<dep[y]?x:y;
}
}
int LCA(int x,int y)
{
x=dfn[x],y=dfn[y];
if(x>y) std::swap(x,y);
int d=Log[y+1-x];
x=st[d][x],y=st[d][y-(1<<d)+1];
return dep[x]<dep[y]?x:y;
}
int getdis(int x,int y)
{
return dis[x]+dis[y]-(dis[LCA(x,y)]<<1);
}
}
namespace seg
{
#define ls ch[now][0]
#define rs ch[now][1]
int ch[N*100][2],mi[N*100],tot;
void ins(int &now,int l,int r,int p,int d)
{
if(!now) now=++tot;
if(l==r) {mi[now]=d;return;}
int mid=l+r>>1;
if(p<=mid) ins(ls,l,mid,p,d);
else ins(rs,mid+1,r,p,d);
mi[now]=min(mi[ls],mi[rs]);
}
int query(int now,int L,int R,int l,int r)
{
if(!now) return inf;
if(L==l&&R==r) return mi[now];
int Mid=L+R>>1;
if(r<=Mid) return query(ls,L,Mid,l,r);
else if(l>Mid) return query(rs,Mid+1,R,l,r);
else return min(query(ls,L,Mid,l,Mid),query(rs,Mid+1,R,Mid+1,r));
}
void init()
{
mi[0]=inf;
}
}
using RMQLCA::getdis;
using seg::query;
using seg::ins;
int siz[N],del[N],par[N],root[N],si,mi,rt,n,m;
void dfsrt(int now,int fa)
{
siz[now]=1;
int mx=0;
for(int v,i=head[now];i;i=Next[i])
if((v=to[i])!=fa&&!del[v])
{
dfsrt(v,now);
siz[now]+=siz[v];
mx=mx>siz[v]?mx:siz[v];
}
mx=mx>si-siz[now]?mx:si-siz[now];
if(mx<mi) mi=mx,rt=now;
}
void dfs(int now,int rt,int fa,int dis)
{
ins(root[rt],1,n,now,dis);
siz[now]=1;
for(int v,i=head[now];i;i=Next[i])
if((v=to[i])!=fa&&!del[v])
dfs(v,rt,now,dis+edge[i]),siz[now]+=siz[v];
}
void divide(int now)
{
del[now]=1;
dfs(now,now,0,0);
for(int v,i=head[now];i;i=Next[i])
if(!del[v=to[i]])
{
si=siz[v],mi=n;
dfsrt(v,0);
par[rt]=now;
divide(rt);
}
}
int main()
{
read(n);
for(int u,v,d,i=1;i<n;i++) read(u),read(v),read(d),add(u,v,d),add(v,u,d);
RMQLCA::init();
seg::init();
si=n,mi=n,dfsrt(1,0),divide(rt);
read(m);
for(int l,r,x,s,ans,i=1;i<=m;i++)
{
read(l),read(r),read(x),s=x;
ans=inf;
while(x)
{
int mi=query(root[x],1,n,l,r);
ans=min(ans,mi+getdis(s,x));
x=par[x];
}
printf("%d\n",ans);
}
return 0;
}

2019.3.17

「2017 山东三轮集训 Day7 解题报告的更多相关文章

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

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

  2. 「2017 山东三轮集训 Day7」Easy

    一棵带边权的树,多次询问 $x$ 到编号为 $[l,r]$ 的点最短距离是多少 $n \leq 100000$ sol: 动态点分治,每层重心维护到所有点的距离 查询的时候在管辖这个点的 log 层线 ...

  3. #6145. 「2017 山东三轮集训 Day7」Easy 动态点分治

    \(\color{#0066ff}{题目描述}\) JOHNKRAM 最近在参加 C_SUNSHINE 举办的聚会. C 国一共有 n 座城市,这些城市由 n−1 条无向道路连接.任意两座城市之间有且 ...

  4. LOJ #6145. 「2017 山东三轮集训 Day7」Easy 点分树+线段树

    这个就比较简单了~ Code: #include <cstdio> #include <algorithm> #define N 100004 #define inf 1000 ...

  5. 「2017 山东三轮集训 Day1」Flair

    模拟赛的题 好神仙啊 题面在这里 之前的Solution很蠢 现在已经update.... 题意 有$ n$个商品价格均为$ 1$,您有$ m$种面值的货币,面值为$ C_1..C_m$ 每种物品你有 ...

  6. 【loj6142】「2017 山东三轮集训 Day6」A 结论题+Lucas定理

    题解: 当奇数 发现答案就是C(n,1)^2+C(n,3)^2+...C(n,n)^2 倒序相加,发现就是C(2n,n) 所以答案就是C(2n,n)/2 当偶数 好像并不会证 打表出来可以得到 2.当 ...

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

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

  8. loj #6138. 「2017 山东三轮集训 Day4」Right

    题目: 题解: 暴力一波 \(SG\) 函数可以发现这么一个规律: \(p\) 为奇数的时候 : \(SG(n) = n \% 2\) \(p\) 为偶数的时候 : \(SG(n) = n \% (p ...

  9. loj #6136. 「2017 山东三轮集训 Day4」Left

    题目: 题解: 我们可以发现所有的交换器都是一个位置连接着下一层左侧的排序网络,另一个位置连着另一侧的排序网络. 而下一层是由两个更低阶的排序网络构成的. 两个网络互不干扰.所以我们可以通过第一行和最 ...

随机推荐

  1. 【学习总结】GirlsInAI ML-diary day-3-数据类型

    [学习总结]GirlsInAI ML-diary 总 原博github链接-day3 数据类型 熟悉一下计算时可能碰到的数据类型.(计算时...) 1-打开jupyter,new一个新python文件 ...

  2. PAT L3-016 二叉搜索树的结构

    https://pintia.cn/problem-sets/994805046380707840/problems/994805047903240192 二叉搜索树或者是一棵空树,或者是具有下列性质 ...

  3. this is incompatible with sql_mode=only_full_group_by

    mysql命令gruop by报错this is incompatible with sql_mode=only_full_group_by - Jim_.NET - 博客园 http://www.c ...

  4. CSS响应式布局实例

    <style type="text/css">        body{            margin:0 auto;            min-width: ...

  5. IdentityServer4【Introduction】之术语

    术语 在规范.文档和对象模型中使用了一些你应该了解的术语. IdentityServer IdentityServer是一个OpenID Connect的提供者,它实现了OpenID Connect和 ...

  6. Java 数据库简单操作类

    数据库操作类,将所有连接数据库的配置信息以及基本的CRUD操作封装在一个类里,方便项目里使用,将连接数据库的基本信息放在配置文件 "dbinfo.properties" 中,通过类 ...

  7. C# Note17: 使用Ionic.Zip.dll实现解压缩文件

    首先下载ionic.Zip.dll,然后在项目中添加该引用,之后就可以在cs中使用了: using Ionic.Zip; #region Ionic.Zip压缩文件 private readonly ...

  8. RandomStringUtils

    System.out.println(RandomStringUtils.random(5));//随机多少个随机字符中文环境乱码 System.out.println(RandomStringUti ...

  9. 18个Python高效编程技巧,Mark!

    初识Python语言,觉得python满足了我上学时候对编程语言的所有要求.python语言的高效编程技巧让我们这些大学曾经苦逼学了四年c或者c++的人,兴奋的不行不行的,终于解脱了.高级语言,如果做 ...

  10. Front-end Job Interview Questions

    Front-end Job Interview Questions 前端面试 https://github.com/h5bp/Front-end-Developer-Interview-Questio ...