POJ 3162 Walking Race 树形dp 优先队列
题意 : 一棵n个节点的树。wc爱跑步,跑n天,第i天从第i个节点开始跑步,每次跑到距第i个节点最远的那个节点(产生了n个距离),现在要在这n个距离里取连续的若干天,使得这些天里最大距离和最小距离的差小于M,问怎么取使得天数最多?
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
#define pa pair<long long,int>
const int maxn=;
int n,m;
priority_queue< pa,vector< pa >,less< pa > >q1;
priority_queue< pa,vector< pa >,greater< pa > >q2;
struct nod{
int y;
long long v;
int next;
}e[maxn*];
int vis[maxn]={};
long long f[maxn][]={}; //0父亲 1最长 2次长
long long ma[maxn]={};
int f1[maxn][]={};
int head[maxn]={};
int tot=;
void init(int x,int y,long long v){
e[++tot].y=y;
e[tot].v=v;
e[tot].next=head[x];
head[x]=tot;
}
void dfs(int x){
int y;
vis[x]=;
long long tmp=;
for(int i=head[x];i;i=e[i].next){
y=e[i].y;
tmp=e[i].v;
if(!vis[y]){
dfs(y);
tmp+=f[y][];
if(tmp>f[x][]){
f[x][]=f[x][];
f1[x][]=f1[x][];
f[x][]=tmp;
f1[x][]=y;
}
else if(tmp>f[x][]){
f[x][]=tmp;
f1[x][]=y;
}
}
}
}
void dfs2(int x,int fa,long long v){
int y;
long long tmp;
vis[x]=;
if(f1[fa][]==x){
f[x][]=v+max(f[fa][],f[fa][]);
}
else{
f[x][]=v+max(f[fa][],f[fa][]);
}
ma[x]=max(f[x][],f[x][]);
for(int i=head[x];i;i=e[i].next){
y=e[i].y;
tmp=e[i].v;
if(!vis[y]){
dfs2(y,x,tmp);
}
}
}
long long mab(long long x){
if(x<){
return -x;
}
return x;
}
int main(){
scanf("%d%d",&n,&m);
int y;
long long v;
for(int i=;i<n;i++){
scanf("%d%lld",&y,&v);
init(i+,y,v);
init(y,i+,v);
}dfs();
memset(vis,,sizeof(vis));
dfs2(,,);
int ans=;
int l=,r=;
for(int i=;i<=n;i++){
q1.push(make_pair(ma[i],i));
q2.push(make_pair(ma[i],i));
r++;
int id1=q1.top().second,id2=q2.top().second;
while(id1<l){
q1.pop();
id1=q1.top().second;
}
while(id2<l){
q2.pop();
id2=q2.top().second;
}
long long z1=q1.top().first,z2=q2.top().first;
while(mab(z1-z2)>=m){
l++;
while(id1<l){
q1.pop();
id1=q1.top().second;
}
while(id2<l){
q2.pop();
id2=q2.top().second;
}
z1=q1.top().first,z2=q2.top().first;
}ans=max(ans,r-l+);
}
cout<<ans<<endl;
return ;
}
POJ 3162 Walking Race 树形dp 优先队列的更多相关文章
- POJ 3162.Walking Race 树形dp 树的直径
Walking Race Time Limit: 10000MS Memory Limit: 131072K Total Submissions: 4123 Accepted: 1029 Ca ...
- POJ - 3162 Walking Race 树形dp 单调队列
POJ - 3162Walking Race 题目大意:有n个训练点,第i天就选择第i个训练点为起点跑到最远距离的点,然后连续的几天里如果最远距离的最大值和最小值的差距不超过m就可以作为观测区间,问这 ...
- 【题解】poj 3162 Walking Race 树形dp
题目描述 Walking RaceTime Limit: 10000MS Memory Limit: 131072KTotal Submissions: 4941 Accepted: 1252Case ...
- POJ 3162 Walking Race 树形DP+线段树
给出一棵树,编号为1~n,给出数m 漂亮mm连续n天锻炼身体,每天会以节点i为起点,走到离i最远距离的节点 走了n天之后,mm想到知道自己这n天的锻炼效果 于是mm把这n天每一天走的距离记录在一起,成 ...
- POJ 3162 Walking Race(树形dp+单调队列 or 线段树)
http://poj.org/problem?id=3162 题意:一棵n个节点的树.有一个屌丝爱跑步,跑n天,第i天从第i个节点开始跑步,每次跑到距第i个节点最远的那个节点(产生了n个距离),现在要 ...
- 【POJ3162】Walking Race 树形dp+单调队列+双指针
题目大意:给定一棵 N 个节点的无根树,边有边权,现生成一个序列 d,d[i] 表示 i 号节点到树上其他节点距离的最大值.给定一个 m,求 d 序列中最大值和最小值之差不超过 m 的最长连续段的长度 ...
- POJ 3162 Walking Race(树的直径+单调队列)
题目大意:对一棵树,求出从每个结点出发能到走的最长距离(每个结点最多只能经过一次),将这些距离按排成一个数组得到dis[1],dis[2],dis[3]……dis[n] ,在数列的dis中求一个最长的 ...
- POJ 3162 Walking Race (树的直径,单调队列)
题意:给定一棵带边权的n个节点的树,首先要求出每个点的最长路,然后写成序列d[1],d[2]...d[n],然后求满足 区间最大值-区间最小值<=k 的最大区间长度为多少? 思路: 分两步进行: ...
- poj 2324 Anniversary party(树形DP)
/*poj 2324 Anniversary party(树形DP) ---用dp[i][1]表示以i为根的子树节点i要去的最大欢乐值,用dp[i][0]表示以i为根节点的子树i不去时的最大欢乐值, ...
随机推荐
- Vue 子路由 与 单页面多路由 的区别
本文地址:http://www.cnblogs.com/veinyin/p/7911292.html 最近学完了基础课程,打算整理一波笔记,对基本概念梳理一遍,惊觉对子路由和单页面多路由混淆的一塌糊涂 ...
- Attention-over-Attention Neural Networks for Reading Comprehension论文总结
Attention-over-Attention Neural Networks for Reading Comprehension 论文地址:https://arxiv.org/pdf/1607.0 ...
- 有关mysql的innodb_flush_log_at_trx_commit参数【转】
一.参数解释 0:log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行.该模式下在事务提交的时候,不会主动触发写入磁盘的操作. 1:每次事务 ...
- Codeforces Round #441 (Div. 2)
Codeforces Round #441 (Div. 2) A. Trip For Meal 题目描述:给出\(3\)个点,以及任意两个点之间的距离,求从\(1\)个点出发,再走\(n-1\)个点的 ...
- openjudge-NOI 2.6-2728 摘花生
题目链接:http://noi.openjudge.cn/ch0206/2728/ 题解: 某一个点只能从其左边或者上边走过来 f[i][j]存储(i,j)这个点上的结果,即f[i][j]=max(f ...
- 关于ORA-04091异常的出现原因,以及解决方案
问题分析 在Oracle中执行DML语句的时候是需要显示进行提交操作的.当我们进行插入的时候,会触发触发器执行对触发器作用表和扩展表的种种操作,但是这个时 候触发器和插入语句是在同一个事务管理中的,因 ...
- fullpage.js 具体使用方法
1.fullpage.js 下载地址 https://github.com/alvarotrigo/fullPage.js 2.fullPage.js 是一个基于 jQuery 的插件,它能够很方便 ...
- MemCached缓存操作
Web项目在运行时,通常需要从数据库中进行读写.随着操作数据量的增大,以及访问量的集中,数据库的负载增加,数据库响应变慢,网站访问速度变慢的情况.Memcached就是用来解决这些问题的. Memca ...
- 用js实现图片连播和联级菜单的实现
<!DOCTYPE html> <html> <head> <title>图片轮播</title> <style> div{ b ...
- yolo回归型的物体检测
本弱又搬了另外一个博客的讲解: 缩进YOLO全称You Only Look Once: Unified, Real-Time Object Detection,是在CVPR2016提出的一种目标检测算 ...