HDU 4213 Bob’s Race(树形dp+单调队列)
来源:互联网 发布:视频教学软件 编辑:程序博客网 时间:2024/05/18 01:28
题目链接:
HDU 4213 Bob’s Race
题意:
给出一个
数据范围:
分析:
首先两遍
然后就可以单调队列处理了,之前也写过:There。
Good luck….
#include <stdio.h>#include <string.h>#include <algorithm>#include <math.h>using namespace std;typedef long long ll;const int MAX_N = 50010;int n, m, total;int head[MAX_N], down[MAX_N], ddown[MAX_N], id[MAX_N], father[MAX_N], best[MAX_N];int inc[MAX_N], dec[MAX_N], inc_head, inc_tail, dec_head, dec_tail;struct Edge { int v, w, next;}edge[MAX_N * 2];void AddEdge(int u, int v, int w){ edge[total].v = v; edge[total].w = w; edge[total].next = head[u]; head[u] = total++;}void dfs_son(int u, int p){ for (int i = head[u]; i != -1; i = edge[i].next) { int v = edge[i].v, w = edge[i].w; if (v == p) continue; dfs_son(v, u); if (w + down[v] > down[u]) { ddown[u] = down[u]; down[u] = down[v] + w; id[u] = v; } else if (down[v] + w > ddown[u]) { ddown[u] = down[v] + w; } }}void dfs_father(int u, int p){ for (int i = head[u]; i != -1; i = edge[i].next) { int v = edge[i].v, w = edge[i].w; if (v == p) continue; if (id[u] == v) father[v] = max(father[u], ddown[u]) + w; else father[v] = max(father[u], down[u]) + w; dfs_father(v, u); } }int main(){ while (~scanf("%d%d", &n, &m) && (n || m)) { memset(head, -1, sizeof(head)); total = 0; for (int i = 1; i < n; ++i) { int u, v, w; scanf("%d%d%d", &u, &v, &w); AddEdge(u, v, w); AddEdge(v, u, w); } memset(down, 0, sizeof(down)); memset(ddown, 0, sizeof(ddown)); memset(id, -1, sizeof(id)); dfs_son(1, 0); dfs_father(1, 0); for (int i = 1; i <= n; ++i) { best[i] = max(down[i], father[i]); } for (int i = 0; i < m; ++i) { int limit, ans = 0, pre = 1; scanf("%d", &limit); inc_head = inc_tail = dec_head = dec_tail = 1; for (int j = 1; j <= n; ++j) { while (inc_tail > inc_head && best[inc[inc_tail - 1]] > best[j]) inc_tail--; inc[inc_tail++] = j; while (dec_tail > dec_head && best[dec[dec_tail - 1]] < best[j]) dec_tail--; dec[dec_tail++] = j; while (1) { int diff = best[dec[dec_head]] - best[inc[inc_head]]; if (diff <= limit) break; if (dec[dec_head] < inc[inc_head]) { pre = dec[dec_head] + 1; dec_head++; } else { pre = inc[inc_head] + 1; inc_head++; } } ans = max(ans, j - pre + 1); } printf("%d\n", ans); } } return 0;}
0 0
- HDU 4213 Bob’s Race(树形dp+单调队列)
- hdu 4123 Bob’s Race 树形DP + 单调队列
- hdu 4123 Bob’s Race(树形DP+单调队列)
- hdu 4123 Bob’s Race 树形dp+单调队列
- HDU 4123 Bob’s Race (树形DP + 单调队列)
- HDU 4123 Bob’s Race(树形DP + 单调队列)
- 树形DP+RMQ+单调队列(Bob’s Race HDU4123)
- 两种解法-树形dp+二分+单调队列(或RMQ)-hdu-4123-Bob’s Race
- hdu 4123 Bob’s Race(单调队列或者rmq)
- HDU 4123 Bob’s Race 树的直径+单调队列
- HDU 4123--Bob’s Race(树形dp)
- hdu 4123 Bob’s Race(树形DP&RMQ)
- HDU 4123 Bob’s Race(树形DP+RMQ)
- hdu 4123 Bob’s Race(树形dp+RMQ)
- HDU 4123 Bob’s Race(树形DP+RMQ)
- HDU 4123 - Bob’s Race(树形DP + RMQ)
- hdu 4123 Bob’s Race 树形DP + RMQ
- HDU 4123 Bob’s Race(树形DP,rmq)
- RecyclerView
- 解决项目变砖的问题
- 计算机思维-最快的学习方法
- leetcode Substring with Concatenation of All Words
- 华为OJ题解(中级)
- HDU 4213 Bob’s Race(树形dp+单调队列)
- UITextView实现占位文字
- String str = new String("Hello"); 的内存分配
- android IPC机制(三)
- windows安装OracleXE112 64与PL/SQL连接详解
- SQL中JOIN和UNION区别、用法及示例介绍
- centos7安装emacs
- 论文笔记 | BoxSup: Exploiting Bounding Boxes to Supervise Convolutional Networks for Semantic Segmentati
- VPS CentOS 7搭建ss完整教程