hdu 4123 树形DP+单调队列
http://acm.hust.edu.cn/vjudge/problem/25790
这题基本同poj 3162
要注意mx,mx2,vx,vx2每次都要初始化
#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <stack>
#include <queue>
#include <cctype>
#include <vector>
#include <iterator>
#include <set>
#include <map>
#include <sstream>
using namespace std; #define mem(a,b) memset(a,b,sizeof(a))
#define pf printf
#define sf scanf
#define spf sprintf
#define pb push_back
#define debug printf("!\n")
#define MAXN 50000+5
#define MAX(a,b) a>b?a:b
#define blank pf("\n")
#define LL long long
#define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin())
#define pqueue priority_queue
#define INF 0x3f3f3f3f #define ls (rt<<1)
#define rs (rt<<1|1) int n,m; int head[MAXN],vis[MAXN],ptr=; int mx[MAXN],mx2[MAXN],vx[MAXN],vx2[MAXN]; int p1[MAXN],p2[MAXN],ans; struct node{int y,next,val;}tree[MAXN<<]; void init()
{
mem(head,-);
mem(vis,);
mem(mx,);
mem(mx2,);
mem(vx,);
mem(vx2,);
ptr = ;
} void add(int son,int fa,int val)
{
tree[ptr].y=son;
tree[ptr].val=val;
tree[ptr].next=head[fa];
head[fa]=ptr++;
} void dfs(int root,int fa)
{
for(int i = head[root];i!=-;i=tree[i].next)
{
int y = tree[i].y;
if(y==fa) continue;
dfs(y,root);
if(mx2[root]<mx[y]+tree[i].val)
{
vx2[root] = y;
mx2[root] = mx[y]+tree[i].val;
if(mx2[root]>mx[root])
{
swap(vx2[root],vx[root]);
swap(mx2[root],mx[root]);
}
}
}
} void dfs2(int root,int fa)
{
for(int i = head[root];i!=-;i=tree[i].next)
{
int y = tree[i].y;
if(y==fa) continue;
if(y == vx[root])
{
if(mx2[root]+tree[i].val > mx2[y])
{
mx2[y] = mx2[root]+tree[i].val;
vx2[y] = root;
if(mx2[y]>mx[y])
{
swap(vx2[y],vx[y]);
swap(mx2[y],mx[y]);
}
}
}
else
{
if(mx[root]+tree[i].val > mx2[y])
{
mx2[y] = mx[root]+tree[i].val;
vx2[y] = root;
if(mx2[y]>mx[y])
{
swap(vx2[y],vx[y]);
swap(mx2[y],mx[y]);
}
}
}
dfs2(y,root);
}
} void getL(int q)
{
int h1,h2,r1,r2,pre;
h1=h2=pre=;
r1=r2=ans=;
for(int i=;i<=n;i++)
{
while(h1<=r1 && mx[p1[r1]]>=mx[i]) r1--;
p1[++r1] = i;
while(h2<=r2 && mx[p2[r2]]<=mx[i]) r2--;
p2[++r2] = i;
while(h1<=r1 && h2<=r2 && mx[p2[h2]]-mx[p1[h1]]>q)
{
if(p1[h1]>p2[h2]) pre = p2[h2++]+;
else pre = p1[h1++]+;
}
if(h1<=r1 && h2<=r2 && mx[p2[h2]]>=mx[p1[h1]])
{
ans = max(ans,i-pre+);
}
}
} int main()
{
int i,j;
while(~sf("%d%d",&n,&m),m+n)
{
init();
for(i=;i<=n;i++)
{
int x,y,z;
sf("%d%d%d",&x,&y,&z);
add(y,x,z);
add(x,y,z);
}
dfs(,);
dfs2(,);
/*
for(i=1;i<=n;i++) pf("%d ",mx[i]);
blank;
*/
int q;
for(i=;i<m;i++)
{
mem(p1,);
mem(p2,);
sf("%d",&q);
getL(q);
pf("%d\n",ans);
}
}
}
hdu 4123 树形DP+单调队列的更多相关文章
- hdu 4123 树形DP+RMQ
http://acm.hdu.edu.cn/showproblem.php? pid=4123 Problem Description Bob wants to hold a race to enco ...
- (noip模拟二十一)【BZOJ2500】幸福的道路-树形DP+单调队列
Description 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光. 他们画出了晨练路线的草图,眼尖的小T发现可以用树来描绘这个草图. ...
- HDU 4123 Bob’s Race 树形dp+单调队列
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4123 Time Limit: 5000/2000 MS (Java/Others) Memory L ...
- bzoj2500: 幸福的道路(树形dp+单调队列)
好题.. 先找出每个节点的树上最长路 由树形DP完成 节点x,设其最长路的子节点为y 对于y的最长路,有向上和向下两种情况: down:y向子节点的最长路g[y][0] up:x的次长路的g[x][1 ...
- HDU 3401 Trade dp+单调队列优化
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3401 Trade Time Limit: 2000/1000 MS (Java/Others)Mem ...
- bzoj2500幸福的道路 树形dp+单调队列
2500: 幸福的道路 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 434 Solved: 170[Submit][Status][Discuss ...
- Codeforces 980F Cactus to Tree 仙人掌 Tarjan 树形dp 单调队列
原文链接https://www.cnblogs.com/zhouzhendong/p/CF980F.html 题目传送门 - CF980F 题意 给定一个 $n$ 个节点 $m$ 条长为 $1$ 的边 ...
- POJ - 3162 Walking Race 树形dp 单调队列
POJ - 3162Walking Race 题目大意:有n个训练点,第i天就选择第i个训练点为起点跑到最远距离的点,然后连续的几天里如果最远距离的最大值和最小值的差距不超过m就可以作为观测区间,问这 ...
- [BZOJ 2500]幸福的道路 树形dp+单调队列+二分答案
考试的时候打了个树链剖分,而且还审错题了,以为是每天找所有点的最长路,原来是每天起点的树上最长路径再搞事情.. 先用dfs处理出来每个节点以他为根的子树的最长链和次长链.(后面会用到) 然后用类似dp ...
随机推荐
- Oracle中merge into语法
merge into 语句就是insert和update的一个封装,简单来说就是: 有则更新,无则插入 下面说怎么使用 MERGE INTO table_Name T1(匿名) using (另外一 ...
- P1987 摇钱树
题意:有n棵摇钱树,k天,每天可砍一棵并获得其金币 每棵树初始有$a_i$个金币,每天减少$b_i$个 问k天得到的最多金币数 这题很明显是DP(锻炼自己的机会来了QAQ) 设$f[i][j]$ ...
- opencv-视频基本操作
写视频 # encoding: utf-8 ''' @author: gaoyongxian666 @file: opencv_video_write.py @time: 2018/4/15 11:1 ...
- Nginx02---指令集实现静态文件服务器
location 实现静态服务器,就是root和alias命令,他们位于location文件块中,详细:https://www.jianshu.com/p/4be0d5882ec5 root root ...
- 微信小程序生成带参二维码
需求:生成小程序中的海报,需要小程序二维码可以使用户保存到本地在朋友圈分享 生成二维码工具类代码如下: package com.aone.foottalk.action.wx.util; import ...
- Ubuntu上的Python
在Ubuntu如何查看Python版本 2版本命令:Python -V (注意是大写) 3版本命令:Python3 -V Ubutun16上默认安装Python 2.7, Python3 将Pyth ...
- SQL Server 数据导入与导出
1. BCP 命令 用法: bcp {dbtable | query} {in | out | queryout | format} 数据文件 [-m 最大错误数] [-f 格式化文件] [-e 错误 ...
- 暴力打表之hdu 2089
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 有两种方法: 1.数位DP算法 2.暴力打表——真是个好法子!!! 接下来是注意点: 1.一般这 ...
- MySQL之prepare用法
MySQL官方将prepare.execute.deallocate统称为PREPARE STATEMENT,习惯称其为[预处理语句],下面是对其详细的介绍. 示例代码 PREPARE stmt_na ...
- 1.3 IDAE安装GO插件
点击Configure,选择插件Plugins 安装后重启一下IDEA D:\app\Go是Go的安装路径,没有的话,可以下载安装一下Go 选择go项目的代码位置 创建三个文件夹,在src下进行编码 ...