【JZOJ5248】花花的聚会
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】花花的聚会的更多相关文章
- 【NOIP2016练习】T2 花花的聚会 (树形DP,倍增)
题意: 花花住在 H 国.H 国有 n 个城市,其中 1 号城市为其首都.城市间有 n 1 条单向道路.从任意一个城市出发,都可以沿着这些单向道路一路走到首都.事实上,从任何一个城市走到首都的路径是唯 ...
- BSD和云 – 不可错过的BSD聚会
自2012年开始,微软云计算与企业事业部和Citrix思杰,NetApp达成合作,共同开发出第一版针对Hyper-V虚拟设备驱动以及相关的用户态程序,并将此称之为集成服务 (Integration S ...
- 【BZOJ-1787&1832】Meet紧急集合&聚会 倍增LCA
1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 2259 Solved: 1023[Submit] ...
- bzoj-3170 3170: [Tjoi 2013]松鼠聚会(计算几何)
题目链接: 3170: [Tjoi 2013]松鼠聚会 Time Limit: 10 Sec Memory Limit: 128 MB Description 有N个小松鼠,它们的家用一个点x,y表 ...
- DHV 平常语言对话 一次聚会离场
一次聚会离场 一次聚会离场,如果顺路要计划好A女生 和B女生 或者C女闺密一起回去,然后再自己回去 如果别人说:好男人, 自己一定要谦虚说: 哪里,好男人一般都是备胎. 到家了要说: 不是说: 我:我 ...
- BZOJ3170: [Tjoi 2013]松鼠聚会
3170: [Tjoi 2013]松鼠聚会 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 531 Solved: 249[Submit][Statu ...
- bzoj1832: [AHOI2008]聚会
写过的题... #include<cstdio> #include<cstring> #include<iostream> #include<algorith ...
- BZOJ 3170: [Tjoi 2013]松鼠聚会 切比雪夫距离
3170: [Tjoi 2013]松鼠聚会 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...
- tyvj1161聚会的名单(trie树)
背景 Background 明天就是candy的生日,candy又会邀请自己的一大堆好友来聚会了!哎!又要累坏飘飘乎居士了!! 描述 Description 明天就是candy的生日.晚上,c ...
随机推荐
- Django框架下的增强分页组件
本文通过文章同步功能推送至博客园,显示排版可能会有所错误,请见谅! 描述:Django框架内置了分页功能,但其只能满足简单需求,难以实现复杂功能. 实现代码: #!/usr/bin/env pytho ...
- 致初学者(一): HDU 2000~ 2013题解
对于开始学习C语言程序设计或C++程序设计面向过程部分的同学来说,利用在线OJ网站进行实践训练,对提高自己的编程能力很有好处.国内外OJ网站很多,每个都去看看,去刷个题,是不现实的,也没必要.即使一个 ...
- Java连载30-方法重载、方法递归
一.方法重载 1.又被称为overload 2.方法重载使用场景 功能类似的时候,尽可能仍方法名相同(但是功能不同或者不相似的时候,方法名尽量不同) 3.什么条件满足之后,可以构成方法重载 (1)在同 ...
- 金融风控100道面试题:传统银行开发转行互金top3公司并年薪40多万
知乎上有一个50万人看过的问题“为什么自学Python看不进去?”,其实原因很简单,大家缺乏能动手实战的机会. 知识要是死记硬背记在在脑海中,用不了多久就会忘记,只用依靠实战才能让知识落地. 小七这次 ...
- js 中 undefined、NaN、null
undefined 即未定义 js 中 没有声明 或者 声明后未赋值的变量 用typeof判断后类型都是 undefined 但是直接console.log( ) 输出的话 没有声明的变量会报错:而声 ...
- 初学FPGA图像处理,开发板选择建议
我用的是ZYNQ7010的开发板,纯粹是入门学习,对于初学者,使用较多的xlinx入门级的开发板一般是zynq7000系列,淘宝上买的较好的是黑金和米联科,我买的就是黑金的,个人觉得教程很少,学习资料 ...
- (二)spring 高级装配-Condition -条件化的bean
Condition:满足某个特定条件的情况下创建bean 条件化配置bean: a:@Conditional 指定一个class ,它指明了通过条件对比的类.如果没有指定class则通过Condito ...
- Centos利用脚本自动安装jdk
在工作中还有自己的学习中,无论是使用tar包安装jdk,还是使用rpm安装,如果单台机器还能够接受,但是如果多台机器,就很困扰.所以,在自己配置环境的时候,根据网上各位前辈,沉淀了这样子一个脚 ...
- Linux初识之Centos7中terminal光标位置偏移问题的解决
新安装的centos7打开terminal发现光标位置向右偏移,使用起来影响感官,经查询后找到类似情况并顺利解决问题,特记录解决过程以作参考. 1.未解决时光标向右偏移显示: 2.打开设置(Setti ...
- 新手学习FFmpeg - 调用API编写实现多次淡入淡出效果的滤镜
前面几篇文章聊了聊FFmpeg的基础知识,我也是接触FFmpeg不久,除了时间处理之外,很多高深(滤镜)操作都没接触到.在学习时间处理的时候,都是通过在ffmpeg目前提供的avfilter基础上面修 ...