博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[POJ3162]Walking Race(DP + 单调队列)
阅读量:4586 次
发布时间:2019-06-09

本文共 2589 字,大约阅读时间需要 8 分钟。

 

题意:一棵n个节点的树。wc爱跑步,跑n天,第i天从第i个节点开始跑步,每次跑到距第i个节点最远的那个节点(产生了n个距离),现在要在这n个距离里取连续的若干天,使得这些天里最大距离和最小距离的差小于M,问怎么取使得天数最多?

 

求每个点到最远距离的点的距离可以用 的方法。

至于第二问,可以跑一遍2个单调队列。

具体是固定左端点,右端点向右平移到最远,直到不能平移,再左端点向右平移一位。在这中间维护单调队列和更新 ans 最大值。

 

具体细节看代码

——代码

#include 
#include
#include
#define N 1000001#define max(x, y) ((x) > (y) ? (x) : (y))int n, m, cnt, h1 = 1, t1, h2 = 1, t2, ans;int head[N], to[N << 1], val[N << 1], next[N << 1], f[N][3], a[N], q1[N], q2[N];bool vis[N];inline int read(){ int x = 0, f = 1; char ch = getchar(); for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1; for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0'; return x * f;}inline void add(int x, int y, int z){ to[cnt] = y; val[cnt] = z; next[cnt] = head[x]; head[x] = cnt++;}inline void dfs1(int u){ int i, v, d1 = 0, d2 = 0; vis[u] = 1; for(i = head[u]; i ^ -1; i = next[i]) { v = to[i]; if(!vis[v]) { dfs1(v); if(f[v][0] + val[i] > d1) d2 = d1, d1 = f[v][0] + val[i]; else if(f[v][0] + val[i] > d2) d2 = f[v][0] + val[i]; } } f[u][0] = d1; f[u][1] = d2;}inline void dfs2(int u){ int i, v; vis[u] = 1; for(i = head[u]; i ^ -1; i = next[i]) { v = to[i]; if(!vis[v]) { if(f[v][0] + val[i] == f[u][0]) f[v][2] = f[u][1] + val[i]; else f[v][2] = f[u][0] + val[i]; f[v][2] = max(f[v][2], f[u][2] + val[i]); dfs2(v); } }}int main(){ int i, x, y, z; while(~scanf("%d %d", &n, &m)) { ans = cnt = 0; memset(f, 0, sizeof(f)); memset(head, -1, sizeof(head)); for(i = 1; i < n; i++) { x = read(); y = read(); add(i + 1, x, y); add(x, i + 1, y); } memset(vis, 0, sizeof(vis)); dfs1(1); memset(vis, 0, sizeof(vis)); dfs2(1); for(i = 1; i <= n; i++) a[i] = max(f[i][0], f[i][2]); for(x = 1, y = 0; x <= n; x++) { while(q1[h1] < x && h1 <= t1) h1++; while(q2[h2] < x && h2 <= t2) h2++; while(a[q1[h1]] - a[q2[h2]] < m && y <= n) { y++; while(a[q1[t1]] < a[y] && h1 <= t1) t1--; q1[++t1] = y; while(a[q2[t2]] > a[y] && h2 <= t2) t2--; q2[++t2] = y; } ans = max(ans, y - x); } printf("%d\n", ans); } return 0;}

  

转载于:https://www.cnblogs.com/zhenghaotian/p/7045133.html

你可能感兴趣的文章
Python复习基础篇
查看>>
关于Cocos2d-x中背景音乐和音效的添加
查看>>
.Net持续集成 —— Jenkins+Git+WebDeploy
查看>>
01_Numpy基本使用
查看>>
吴裕雄--天生自然 R语言开发学习:使用键盘、带分隔符的文本文件输入数据
查看>>
CSS选择器详解
查看>>
checkbox和文字对齐
查看>>
JConsole远程连接配置 服务器监控工具
查看>>
了解HTTP协议栈(实践篇)
查看>>
loj10035. 「一本通 2.1 练习 1」Power Strings
查看>>
%s的用法
查看>>
调用底层不能直接访问的类和方法
查看>>
清理缓存的方法 #DF
查看>>
JAVA array,map 转 json 字符串
查看>>
APICloud模块 aMapLBS.singleAddress在ios返回的是定位而不是地址
查看>>
【ZOJ】1610 Count the Colors
查看>>
抱歉最近朋友结婚去浪了几天~未来几天会正常更新.今天带来XML文件解析
查看>>
[beta cycle]daily scrum7_2.22
查看>>
BSD历史
查看>>
Climbing Stairs
查看>>