【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 ...
随机推荐
- 一次使用scrapy的问题记录
前景描述: 需要获取某APP的全国订单量,及抢单量.由于没有全国的选项所以只能分别对每一个城市进行订单的遍历.爬虫每天运行一次,一次获取48小时内的订单,从数据库中取出昨天的数据进行对比,有订单被抢则 ...
- 2019CSP初赛基础知识整理
一.硬件 计算机发展: 年代 元件 第一代 1946~1958 电子管 第二代 1959~1964 晶体管 第三代 1965~1970 集成电路 第四代 1971~? 大规模集成电路 世界上第一台 ...
- Java SSM三端分离开发在线教育平台实战视频教程
目录: 1-01——在线网校实战课程介绍1-02——Eclipse.Maven.JDK介绍1-03——Maven构建Project1-04——新浪SAE介绍2-01——平台业务结构概览2-02——平台 ...
- MySQL二进制日志挖掘器BinlogMiner 1.0发布了。
MySQL从2014年开始超越SQL Server, 占据DB-Engines数据库流行度排行榜第二名, 是一种非常流行的关系型数据库, 特别是在互联网领域, 是一种应该掌握的数据库系统.最近在学My ...
- 一篇RPO漏洞挖掘文章翻译加深理解。
这是我第一次尝试翻译一篇漏洞挖掘文章,翻译它也是为了加深理解它.这是一篇很有意思的漏洞挖掘文章. 前几天在看fd的博客,偶然看到了这篇文章,虽然有点老了.但是思路真的牛皮.我决定花费时间和精力研究它们 ...
- FreeSql (二十六)贪婪加载 Include、IncludeMany、Dto、ToList
贪婪加载顾名思议就是把所有要加载的东西一次性读取. 本节内容为了配合[延时加载]而诞生,贪婪加载和他本该在一起介绍,开发项目的过程中应该双管齐下,才能写出高质量的程序. Dto 映射查询 Select ...
- android 中Application的作用
转自:lieren666 博客地址:http://blog.csdn.net/lieren666/article/details/7598288 What is Application Applica ...
- VMware Workstation Fixed Unable to connect to the MKS
场景:早上开虚拟机时突然报这个错 解决办法如下: 以管理员的身份打开CMD,然后执行如下命令: net start vmx86 net start hcmon net start vmauthdser ...
- web性能优化实践
一.SQL查询优化 1.循环中有多次查询sql,改为在循环外一次查询后再处理 2.循环多次插入,改为组装好数据后批量插入 3.梳理业务逻辑能一次查完的,绝不分多次查 4.索引用起来 5.分页查询 二. ...
- Linux 笔记 - 几个常用且重要的命令
博客地址:http://www.moonxy.com Linux 系统中提供了大量的命令,从文件目录管理,用户管理,到系统监控等等,功能非常丰富,但有几个是常用且重要的命令. 1. 命令 grep 作 ...