UVALive 7148 LRIP 14年上海区域赛K题 树分治
题意 n个点组成一棵树, 带有点权。 求最长不降的路径的长度, 且路径上最大值最小值之差不超过D。
显然是树分治, 但是分治之后如何维护答案呢。
假设当前重心为g, 分别记录g出发不降路径的长度,以及最大值, 和不升路径的长度以及最小值。
这里用到一个map和二分, 线段树也可以, 但是如果用线段树还要考虑负值, 再加上线段树的clear以及稍微暴力的查询。 常数大小不好说。
#include <bits/stdc++.h>
using namespace std;
typedef pair <int, int> pii;
const int maxn = 1e5 + ;
vector <int> G[maxn];
int val[maxn], siz[maxn], n, D;
bool centroid[maxn];
void init() {
for (int i = ; i < maxn; i++) {
G[i].clear();
}
memset(centroid, false, sizeof centroid);
}
void dfs(int u, int father){
siz[u] = ;
for (int v: G[u]){
if (v != father && !centroid[v]){
dfs(v, u);
siz[u] += siz[v];
}
}
}
pii FindCentroid(int u, int father, int t) {
pii res = make_pair(INT_MAX, -);
int s = , m = ;
for (int v: G[u]) {
if (v == father || centroid[v]) {
continue;
}
res = min(res, FindCentroid(v, u, t));
m = max(m, siz[v]);
s += siz[v];
}
siz[u] = s;
m = max(m, t-s);
return min(res, make_pair(m, u));
}
map <int, int> work;
void update(int v, int len) {
auto it = work.lower_bound(v);
if (it != work.end() && it->second >= len) {
return;
}
work[v] = len;
}
void dfs_up(int u, int father, int d) {
if (val[u] > val[father]) {
return;
}
update(val[u], d);
for (int v: G[u]) {
if (v != father && !centroid[v]) {
dfs_up(v, u, d+);
}
}
}
int res;
void dfs_down(int u, int father, int d) {
if (val[u] < val[father]) {
return;
}
auto it = work.lower_bound(val[u]-D);
if (it != work.end()) {
res = max(res, it->second++d);
}
for (int v: G[u]) {
if (!centroid[v] && v != father) {
dfs_down(v, u, d+);
}
}
} void preSolve(int g, vector <int> &son) {
work.clear();
work[val[g]] = ;
for (int v: son) {
if (val[v] >= val[g]) {
dfs_down(v, g, );
}
if (val[v] <= val[g]) {
dfs_up(v, g, );
}
}
}
void solve(int u) {
dfs(u, );
int g = FindCentroid(u, , siz[u]).second;
vector <int> son;
for (int v: G[g]) {
if (!centroid[v]) {
son.push_back(v);
}
}
preSolve(g, son);
reverse(son.begin(), son.end());
preSolve(g, son);
centroid[g] = true;
for (int v: G[g]) {
if (!centroid[v]) {
solve(v);
}
}
}
int main() {
// freopen("in.txt", "r", stdin);
int T, cas = ;
scanf ("%d", &T);
while (T--) {
init();
scanf ("%d%d", &n, &D);
for (int i = ; i <= n; i++) {
scanf ("%d", val+i);
}
for (int i = ; i < n; i++) {
int u, v;
scanf ("%d%d", &u, &v);
G[u].push_back(v);
G[v].push_back(u);
}
res = ;
solve();
printf("Case #%d: %d\n", cas++, res);
}
return ;
}
UVALive 7148 LRIP 14年上海区域赛K题 树分治的更多相关文章
- UVAlive7141 BombX 14年上海区域赛D题 线段树+离散化
题意:一个无限大的棋盘, 有n个小兵, 给出了n个兵的坐标, 现在有一个长为width 高为height的炸弹放在棋盘上, 炸弹只能上下左右平移, 不能旋转. 且放炸弹的区域不能含有士兵, 炸弹可以一 ...
- hdu5080:几何+polya计数(鞍山区域赛K题)
/* 鞍山区域赛的K题..当时比赛都没来得及看(反正看了也不会) 学了polya定理之后就赶紧跑来补这个题.. 由于几何比较烂写了又丑又长的代码,还debug了很久.. 比较感动的是竟然1Y了.. * ...
- ACM 2015年上海区域赛A题 HDU 5572An Easy Physics Problem
题意: 光滑平面,一个刚性小球,一个固定的刚性圆柱体 ,给定圆柱体圆心坐标,半径 ,小球起点坐标,起始运动方向(向量) ,终点坐标 ,问能否到达终点,小球运动中如果碰到圆柱体会反射. 学到了向量模板, ...
- hdu 4463 有一条边必须加上 (2012杭州区域赛K题)
耐克店 和 苹果店必须相连 Sample Input42 30 01 00 -1 1 -10 Sample Output3.41 # include <iostream> # includ ...
- ACM学习历程——ZOJ 3829 Known Notation (2014牡丹江区域赛K题)(策略,栈)
Description Do you know reverse Polish notation (RPN)? It is a known notation in the area of mathema ...
- Peekaboo(2019年上海网络赛K题+圆上整点)
目录 题目链接 题意 思路 代码 题目链接 传送门 题意 你的位置在\(O(0,0)\),\(A\)的位置为\((x_1,y_1)\),\(B\)的位置为\((x_2,y_2)\),现在已知\(a=O ...
- 2018南京区域赛K题 Kangaroo Puzzle——随机&&乱搞
题意 在 n * m 的平面上有若干个袋鼠和墙(1为袋鼠,0为墙),每次可以把所有袋鼠整体往一个方向移动一步(不能走出边界和不能走到墙),为在不超过50000步的情况下能否把全部袋鼠聚集在同一个位置. ...
- 2019 ICPC 上海区域赛总结
2019上海区域赛现场赛总结 补题情况(以下通过率为牛客提交): 题号 标题 已通过代码 通过率 我的状态 A Mr. Panda and Dominoes 点击查看 5/29 未通过 B Prefi ...
- HDU-5532//2015ACM/ICPC亚洲区长春站-重现赛-F - Almost Sorted Array/,哈哈,水一把区域赛的题~~
F - Almost Sorted Array Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & ...
随机推荐
- HTML5 文件域+FileReader 分段读取文件(四)
一.分段读取txt文本 HTML: <div class="container"> <div class="panel panel-default&qu ...
- 强制关闭myeclipse出现的问题
重启时,可能会出现打不开关闭前所在的workspace.其他workspace可以正常打开. 今天遇到这个问题,以前就遇到过,但是忘记如何解决了.今天在我等了十多分钟后,神奇的myeclipse自己起 ...
- 第一次用Github desktop(mac)提交代码遇到的问题
1.新建代码仓库 2.生成密钥 ssh-keygen -C 'your@email.address' -t rsa 3.到根目录下的.ssh文件夹下找到id_rsa.pub文件,将里面的内容复制到下图 ...
- 大规模字符串检索-压缩trie树
本文使用压缩trie树实现字符串检索的功能.首先将字符串通过编码转化为二进制串,随后将二进制串插入到trie树中,在插入过程中同时实现压缩的功能. 字符编码采用Huffman,但最终测试发现不采用Hu ...
- Linux fork操作之后发生了什么?又会共享什么呢?
今天我在阅读<Unix网络编程>时候遇到一个问题:accept返回时的connfd,是父子进程之间共享的?我当时很不理解,难道打开的文件描述符不是应该在父子进程间相互独立的吗?为什么是共享 ...
- SGU 195. New Year Bonus Grant
时间限制:0.75s 空间限制:4M 题意: 在一颗树(最多500000个节点)中,可以对节点染色,但是一个节点染了色后,它的父节点和兄弟节点都不能再染了,求最大的染色节点数,并输出所有染色节点. S ...
- centos中文乱码修改字符编码使用centos支持中文
如何你的centos显示中文乱码,只要修改字符编码使centos支持中文就可以了,没有这个文件可以创建它,下面是修改步骤 一.中文支持 安装中文语言包: 复制代码 代码如下: yum groupins ...
- CSS浮动元素的水平居中
方法一: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> ...
- linux下svn客户端报错Cannot negotiate authentication mechanism的解决方法
svn客户端报错Cannot negotiate authentication mechanism的解决方法: 问题出现的原因之一: 因为SVN服务器配置了saslauthd服务用来实现与ldap的对 ...
- /proc/sys/net/ipv4/ip_forward
ip地址分公有地址和私有地址,public address是由INIC(internet network information center)负责,这些ip地址分配给注册并向INIC提出申请的组织机 ...