【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系列---使用MySql数据库
目录 1. 创建数据库 1.1. 使用utf8mb4编码 1.1.1. 确定mysql的配置文件 1.1.2. 修改配置文件 1.1.3. 重启数据库服务,检查相关字段 1.1.4. 新建数据库 1. ...
- requests + BeautifulSoup + json
requests: response.text 以 unicode 格式显示响应的文本 response.content 以 二进制 格式显示响应的文本 BeautiSoup: sou ...
- JAVA之学生信息管理系统
StudentManager系统 系统的数据: 变量 stunumber 为字符串类型 String,用于存储学生的学号(有 8 位数字组成) 变量 name 为字符串类型 String,用于存储学生 ...
- yum rpm apt-get wget 辨析
1)wget: 类似于迅雷,是一种下载工具,通过HTTP.HTTPS.FTP三个最常见的TCP/IP协议下载,并可以使用HTTP代理名字是World Wide Web”与“get”的结合.类似于cur ...
- 一个Android 架构师的成长之路
前言 总所周知,当下流行的编程语言有Java.PHP.C.C++.Python.Go等.其中,稳坐榜首的仍然是Java编程语言,且在以面向对象思想占主导的应用开发中,Java往往成为其代名词.Java ...
- (六十八)c#Winform自定义控件-DEMO整理
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...
- javascript实现二叉搜索树
在使用javascript实现基本的数据结构中,练习了好几周,对基本的数据结构如 栈.队列.链表.集合.哈希表.树.图等内容进行了总结并且写了笔记和代码. 在 github中可以看到 点击查看,可以 ...
- mvn deploy:deploy-file命令
mvn deploy:deploy-file -DgroupId=com.gome -DartifactId=jwebservices -Dversion=2.0 -Dpackaging=jar -D ...
- HABSE表结构理解
也分为行列,行是索引,锁定数据,查找数据只能通过行 列:建表时必须知道列族,真实列(列簇)在插入数据时候可以指定 查找指定列,必须带列族,列族1:name
- uni-app开发微信小程序的几天时间
人只有在不断的学习,才能不断的给自己充电,如果我们停止了学习,就像人没有了血脉,就会死亡,近来学习比较忙,压力比较大,整天面对着电脑,敲击代码,从中虽然收获了快乐,但是换来的确实身体的伤痛,最近虽然自 ...