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. Tomcat性能调优参数简介

    近期,我们的一个项目进入了试运营的阶段,在系统部署至阿里云之后,我们发现整个系统跑起来还是比较慢的,而且,由于代码的各种不规范,以及一期进度十分赶的原因,缺少文档和完整的测试,整个的上线过程一波三折. ...

  2. 【Offer】[24] 【反转链表】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点. 思路分析 利用三个指针,pre,p,pNext,将p的next ...

  3. linux下使用yum安装新版php7.0

    这两天又装了一下虚拟机,又要编译lnmp,还要弄各种拓展,很麻烦,能不能直接yum安装呢?答案是可以的! 1.首先要更新yum源,不然是默认的老版本,一般都在5.6及以下,但是php7都出来好久了,性 ...

  4. CopyOnWriteArrayList实现原理以及源码解析

    1.CopyOnWrite容器(并发容器) Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正 ...

  5. MySQL的安装与配置——详细教程

    免安装版的Mysql MySQL关是一种关系数据库管理系统,所使用的 SQL 语言是用于访问数据库的最常用的 标准化语言,其特点为体积小.速度快.总体拥有成本低,尤其是开放源码这一特点,在 Web 应 ...

  6. SpringCloud(三)Ribbon与Feign

    上一篇使用了Eureka与Ribbon组件做了最简单的的服务注册与发现,我们知道Eureka是实现服务治理中心的组件,但是上一篇Eureka没有实现集群,这样没有保证到Eureka Server的高可 ...

  7. Winform中对自定义xml配置文件进行Xml节点的添加与删除

    场景 Winform中自定义xml配置文件后对节点进行读取与写入: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10053213 ...

  8. Visual Studio Code编写C/C++代码常见问题

    我会把一些常见问题以及自己编写代码过程中遇到的问题以及解决方案放在这里,各位若是遇到的问题也可以在评论区留言. 一.头文件Error 不会影响编译运行,但会报Warm,如下图 解决方案是安装Inclu ...

  9. STL中的unique和unique_copy函数

    一.unique函数 这个函数的功能就是删除相邻的重复元素,然后重新排列输入范围内的元素,并返回一个最后一个无重复值的迭代器(并不改变容器长度). 例如: vector<); ; i < ...

  10. Python3 爬虫之 Scrapy 核心功能实现(二)

    博客地址:http://www.moonxy.com 基于 Python 3.6.2 的 Scrapy 爬虫框架使用,Scrapy 的搭建过程请参照本人的另一篇博客:Python3 爬虫之 Scrap ...