Description

注意测试数据中道路是

的单向道路,与题面恰好相反。

Input

Output

Sample Input

7 7
1 3
1 2
6 7
3 6
3 5
3 4
7 2 3
7 1 1
2 3 5
3 6 2
4 2 4
5 3 10
6 1 20
3
5
6
7

Sample Output

题解:

  这个题目,首先dp十分显然,设dp[i]表示强制在i这个节点购买的走到1号节点的最小话花费转移起来就可以了.

  但显然我们要求可以用这个票到达的祖先节点中dp[x]的最小值,考虑,将票按起点的dfn排序,每次用票来更新dp值,每次更新就在线段树里修改就可以了,线段树维护区间极小值.

代码:

  

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iostream>
#include <vector>
#define MAXN 100010
#define ll long long
using namespace std;
int n,m,q;
int fa[MAXN],dep[MAXN],dfn[MAXN],sz[MAXN],top[MAXN],son[MAXN],id[MAXN];
ll dp[MAXN];
struct edge{
int first;
int next;
int to;
}a[MAXN*];
struct piao{
int x,ti,co;
void read(){
scanf("%d%d%d",&x,&ti,&co);
}
}g[MAXN];
struct tree{
int l,r;ll minn;
}tr[MAXN*];
int num=; void addedge(int from,int to){
a[++num].to=to;
a[num].next=a[from].first;
a[from].first=num;
} void dfs1(int now,int f){
fa[now]=f,sz[now]=,dep[now]=dep[f]+;
for(int i=a[now].first;i;i=a[i].next){
int to=a[i].to;
if(to==f) continue;
dfs1(to,now);
sz[now]+=sz[to];
if(sz[son[now]]<sz[to]) son[now]=to;
}
} void dfs2(int now,int tp){
top[now]=tp;
dfn[now]=++num;id[dfn[now]]=now;
if(son[now]) dfs2(son[now],tp);
for(int i=a[now].first;i;i=a[i].next){
int to=a[i].to;
if(to==fa[now]||to==son[now]) continue;
dfs2(to,to);
}
} void pushup(int xv){
tr[xv].minn=min(tr[xv*].minn,tr[xv*+].minn);
} void build(int xv,int l,int r){
if(l==r){
tr[xv].l=l,tr[xv].r=r;
tr[xv].minn=1ll<<;
return;
}
tr[xv].l=l,tr[xv].r=r;int mid=(l+r)>>;
build(xv*,l,mid),build(xv*+,mid+,r);
pushup(xv);
} bool cmp(piao x,piao y){
return dfn[x.x]<dfn[y.x];
} void insert(int xv,int ps,int x){
int l=tr[xv].l,r=tr[xv].r,mid=(l+r)>>;
if(l==r){
tr[xv].minn=x;return;
}
if(ps<=mid) insert(xv*,ps,x);else insert(xv*+,ps,x);
pushup(xv);
} ll query(int xv,int l,int r){
int L=tr[xv].l,R=tr[xv].r,mid=(L+R)/;
if(l==L&&r==R) return tr[xv].minn;
if(r<=mid) return query(xv*,l,r);
else if(l>mid) return query(xv*+,l,r);
else return min(query(xv*,l,mid),query(xv*+,mid+,r));
} ll getminn(int x,int ti){
ll now=x,ret=dp[MAXN-];
while(dep[x]-dep[top[now]]<=ti&&top[now]&&now!=){
ret=min(ret,query(,dfn[top[now]],dfn[now]));
now=fa[top[now]];
}
if(now==||dep[x]-dep[now]>ti) return ret;
int l=dfn[top[now]],r=dfn[now],mid=(l+r)>>,ans=r;
while(l<=r){
int mid=(l+r)/;
if(dep[x]-dep[id[mid]]<=ti) ans=mid,r=mid-;
else l=mid+;
}
ret=min(ret,query(,ans,dfn[now]));
return ret;
} int main()
{
cin>>n>>m;
for(int i=;i<n;i++){
int x,y;scanf("%d%d",&x,&y);
addedge(y,x);
addedge(x,y);
}
dfs1(,);num=;
dfs2(,);
build(,,n);
for(int i=;i<=m;i++) g[i].read();
sort(g+,g+m+,cmp);
memset(dp,,sizeof(dp));dp[]=;
insert(,,);
for(int i=;i<=m;i++){
int co=g[i].co,ti=g[i].ti,x=g[i].x;
if(x==) continue;
ll xx=getminn(x,ti);
ll ret=getminn(x,ti)+co;
dp[x]=min(dp[x],ret);
insert(,dfn[x],dp[x]);
}
cin>>q;
while(q--){
int x;scanf("%d",&x);
printf("%lld\n",dp[x]);
}
return ;
}

【JZOJ5248】花花的聚会的更多相关文章

  1. 【NOIP2016练习】T2 花花的聚会 (树形DP,倍增)

    题意: 花花住在 H 国.H 国有 n 个城市,其中 1 号城市为其首都.城市间有 n 1 条单向道路.从任意一个城市出发,都可以沿着这些单向道路一路走到首都.事实上,从任何一个城市走到首都的路径是唯 ...

  2. BSD和云 – 不可错过的BSD聚会

    自2012年开始,微软云计算与企业事业部和Citrix思杰,NetApp达成合作,共同开发出第一版针对Hyper-V虚拟设备驱动以及相关的用户态程序,并将此称之为集成服务 (Integration S ...

  3. 【BZOJ-1787&1832】Meet紧急集合&聚会 倍增LCA

    1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 2259  Solved: 1023[Submit] ...

  4. bzoj-3170 3170: [Tjoi 2013]松鼠聚会(计算几何)

    题目链接: 3170: [Tjoi 2013]松鼠聚会 Time Limit: 10 Sec  Memory Limit: 128 MB Description 有N个小松鼠,它们的家用一个点x,y表 ...

  5. DHV 平常语言对话 一次聚会离场

    一次聚会离场 一次聚会离场,如果顺路要计划好A女生 和B女生 或者C女闺密一起回去,然后再自己回去 如果别人说:好男人, 自己一定要谦虚说: 哪里,好男人一般都是备胎. 到家了要说: 不是说: 我:我 ...

  6. BZOJ3170: [Tjoi 2013]松鼠聚会

    3170: [Tjoi 2013]松鼠聚会 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 531  Solved: 249[Submit][Statu ...

  7. bzoj1832: [AHOI2008]聚会

    写过的题... #include<cstdio> #include<cstring> #include<iostream> #include<algorith ...

  8. BZOJ 3170: [Tjoi 2013]松鼠聚会 切比雪夫距离

    3170: [Tjoi 2013]松鼠聚会 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...

  9. tyvj1161聚会的名单(trie树)

    背景 Background 明天就是candy的生日,candy又会邀请自己的一大堆好友来聚会了!哎!又要累坏飘飘乎居士了!! 描述 Description     明天就是candy的生日.晚上,c ...

随机推荐

  1. ORM之Dapper运用

    一.前言 上一篇[分层架构设计]我们已经有了架构的轮廓,现在我们就在这个轮廓里面造轮子.项目要想开始,肯定先得确定ORM框架,目前市面上的ORM框架有很多,对于.net人员来说很容易就想到以ADO.N ...

  2. 实验吧CTF练习题---WEB---FALSE解析

    实验吧web之FALSE 地址:http://www.shiyanbar.com/ctf/1787 flag值:CTF{t3st_th3_Sha1}   解题步骤: 1.点开题目链接,观察题意 2.题 ...

  3. python安装virtualenv虚拟环境步骤

    一.安装virtualenv 点击左下角最边上菜单栏输入cmd,打开命令行   2.根据版本的不同输入命令pip install virtualenv(或者pip3 install virtualen ...

  4. spring aop 之链式调用

    关关雎鸠,在河之洲.窈窕淑女,君子好逑. 概述 AOP(Aspect Orient Programming),我们一般称为面向方面(切面)编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横 ...

  5. unittest核心要素

    1 TestCase 一个TestCase的实例就是一个测试用例.什么是测试用例呢?就是一个完整的测试流程, 包括测试环境的准备(setUp),执行测试代码(run),以及测试后环境的还原(tearD ...

  6. ubuntu连接window系统

    最后可以通过次命令挂载本地文件夹到远程电脑: rdesktop -a 24 -f -r disk:share-name=/home/lion/.m2/ 192.168.151.232

  7. Android 让你的 Room 搭上 RxJava 的顺风车 从重复的代码中解脱出来

    # 什么是 Room ? 谷歌为了帮助开发者解决 Android 架构设计问题,在 Google I/O 2017 发布一套帮助开发者解决 Android 架构设计的方案:Android Archit ...

  8. JavaScript之深入函数(一)

    在任何编程语言中,函数的功能都是十分强大的,JavaScript也不例外.之前已经讲解了函数的一些基本知识,诸如函数定义,函数执行和函数返回值等,今天就带大家深入了解JavaScript中函数的原理及 ...

  9. python2.7过渡到python3.6时遇到的差异总结

    1.Python3中print为一个函数,必须用括号括起来而Python2中print为class print('hello') 2.python3将raw_input和input进行了整合,只有in ...

  10. 抓住那只牛!Catch That Cow POJ-3278 BFS

    题目链接:Catch That Cow 题目大意 FJ丢了一头牛,FJ在数轴上位置为n的点,牛在数轴上位置为k的点.FJ一分钟能进行以下三种操作:前进一个单位,后退一个单位,或者传送到坐标为当前位置两 ...