[hihoCoder#1065]全图传送

试题描述

先知法里奥是 Dota 系列中的一个英雄。机动性强,推塔能力一流,打钱速度快,传送技能使先知可以全地图支援。在后期比拼中通过强大的兵线控制能力使得对方的兵线一直难以过河,并具有一定的后期 DPS 能力。

我们今天要考虑的是传送技能。假设战场是一个树形区域,每个节点有一个权值 vi。当你传送到某个点 u 时,可以支援距离点 u 半径 r 以内的所有节点。请对于下列询问"u r", 回答以 u 节点为中心,半径 r 以内的节点中,权值最大的节点的编号是多少。如果有多个节点,返回编号最小的。

输入

第一行包含一个整数 n (1 ≤ n ≤ 105),表示节点总数。

接下来的一行,包含 n 个数字,表示每个节点的权值 vi (1 ≤ vi ≤ 109)。 接下来的 n-1 行,每行三个整数 (aibi,wi),表示一条连接 aibi 节点的边,边长为 wi(1 ≤ ai, bi ≤ n, 1 ≤ wi ≤ 104)。

接下来的一行包含一个整数 q,表示询问总数(1 ≤ q ≤ 105)。 接下来 q 行,每行包含两个整数 ur(1 ≤ u ≤ n, 0 ≤ r ≤ 109),表示询问以 u 节点为中心,半径 r 以内的节点中,权值最大的节点的编号是多少。如果有多解返回编号最小的。

输出

对于每组询问,输出一行表示对应答案。

输入示例

7
1 2 3 4 5 6 7
1 2 1
2 3 1
2 4 1
1 5 1
5 6 1
5 7 1
4
1 1
1 2
2 1
2 2

输出示例

5
7
4
5

数据规模及约定

见“输入

题解

考虑离线处理每个操作,把操作所对应的节点记录到节点信息上,考虑使用点分治。显然可以递归每次减小问题规模,考虑跨中点的部分,我们 dfs 并记录每个节点的深度和权值,按照深度为关键词排序,处理一下前缀最大值,对于一个询问,我们二分一下更新答案即可。

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cctype>
#include <stack>
#include <vector>
#include <queue>
#include <cstring>
#include <string>
#include <map>
#include <set>
using namespace std;const int BufferSize = 1 << 16;
char buffer[BufferSize], *Head, *Tail;
inline char Getchar() {if(Head == Tail) {int l = fread(buffer, 1, BufferSize, stdin);Tail = (Head = buffer) + l;}return *Head++;
}
int read() {int x = 0, f = 1; char c = getchar();while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }return x * f;
}#define maxn 100010
#define maxm 200010
#define oo 2147483647
int n, m, head[maxn], nxt[maxm], to[maxm], dist[maxm], val[maxn], ans[maxn];void AddEdge(int a, int b, int c) {to[++m] = b; dist[m] = c; nxt[m] = head[a]; head[a] = m;swap(a, b);to[++m] = b; dist[m] = c; nxt[m] = head[a]; head[a] = m;return ;
}int q, m2, h2[maxn], n2[maxn];
struct Que {int u, r;Que() {}Que(int _, int __): u(_), r(__) {}bool operator < (const Que& t) const { return r < t.r; }
} qs[maxn];bool vis[maxn];
int root, f[maxn], siz[maxn], size;
void getroot(int u, int fa) {siz[u] = 1; f[u] = 0;for(int e = head[u]; e; e = nxt[e]) if(to[e] != fa && !vis[to[e]]) {getroot(to[e], u);siz[u] += siz[to[e]];f[u] = max(f[u], siz[to[e]]);}f[u] = max(f[u], size - siz[u]);if(f[u] < f[root]) root = u;return ;
}
int ToT, ns[maxn];
Que A[maxn];
void dfs(int u, int d, int fa) {A[++ToT] = Que(u, d);for(int e = head[u]; e; e = nxt[e]) if(to[e] != fa && !vis[to[e]])dfs(to[e], d + dist[e], u);return ;
}
void solve(int u) {
//  printf("u: %d\n", u);vis[u] = 1;A[ToT = 1] = Que(u, 0);for(int e = head[u]; e; e = nxt[e]) if(!vis[to[e]])dfs(to[e], dist[e], u);sort(A + 1, A + ToT + 1);
//  for(int i = 1; i <= ToT; i++) printf("%d %d\n", A[i].u, A[i].r);for(int i = 1; i <= ToT; i++) ns[i] = A[i].u;for(int i = 2; i <= ToT; i++)if(val[A[i-1].u] > val[A[i].u]) A[i].u = A[i-1].u;else if(val[A[i-1].u] == val[A[i].u] && A[i-1].u < A[i].u) A[i].u = A[i-1].u;for(int i = 1; i <= ToT; i++)for(int u = h2[ns[i]]; u; u = n2[u]) {
//          printf("%d q[u]: %d\n", ns[i], u);Que& que = qs[u];if(que.r < A[i].r) continue;int x = upper_bound(A + 1, A + ToT + 1, Que(0, que.r - A[i].r)) - A;if(x <= ToT && A[x].r <= que.r - A[i].r) x++;x--;if(ans[u] == oo) ans[u] = A[x].u;else if(val[ans[u]] < val[A[x].u]) ans[u] = A[x].u;else if(val[ans[u]] == val[A[x].u] && ans[u] > A[x].u) ans[u] = A[x].u;}for(int e = head[u]; e; e = nxt[e]) if(!vis[to[e]]) {root = 0; f[0] = n + 1; size = siz[to[e]]; getroot(to[e], u);solve(root);}return ;
}int main() {n = read();for(int i = 1; i <= n; i++) val[i] = read();for(int i = 1; i < n; i++) {int a = read(), b = read(), c = read();AddEdge(a, b, c);}q = read();for(int i = 1; i <= q; i++) {int u = read(), r = read();qs[i] = Que(u, r);n2[++m2] = h2[u]; h2[u] = m2;}for(int i = 1; i <= q; i++) ans[i] = oo;root = 0; f[0] = n + 1; size = n; getroot(1, 0);solve(root);for(int i = 1; i <= q; i++) printf("%d\n", ans[i]);return 0;
}

转载于:https://www.cnblogs.com/xiao-ju-ruo-xjr/p/5856221.html

[hihoCoder#1065]全图传送相关推荐

  1. 方舟原始恐惧mod生物代码_方舟生存进化比上帝模式好用的全图传送更新了

    赵哥以前做过gg修改器用的全图传送文件,但是由于修改器的数据更新,代码的更新,那个文件已经失效了,所以赵哥对该文件进行了更新,现在已经可以使用了. 具体使用教程看赵哥以前发的gg修改器使用教程. 打开 ...

  2. 王者荣耀服务器维护中可是别人能玩,王者荣耀在玩时候被别人登了怎么办 | 手游网游页游攻略大全...

    发布时间:2015-10-22 王者荣耀游戏里,孙悟空是一名有着高输出的战士型英雄.那么,孙悟空在对战时有哪些小技巧呢?下面为大家带来王者荣耀孙悟空玩法技巧. 悟空的主动伤害技能其实仅仅只有一个3技能 ...

  3. 无限火力测试服连不上服务器,lol外服测试服更新 无限火力再次上线

    lol外服测试服更新,无限火力再次上线.近日外服测试服更新,官方放出了无限火力更新的消息. 此次外服测试服无限火力,预计从5月14日一直持续到6月5日.长达22天左右的无限火力模式,让你一次性玩个痛快 ...

  4. 图论 ---- 思维搜索全图任意位置传送 1520G - To Go Or Not To Go?

    题目链接 题目大意: 给出网格,格子中有墙.向相邻无墙位置移动花费www,有的位置有权值ai,ja_{i,j}ai,j​,这样的点是传送门,可以从一个传送门传到另一个传送门,花费ai,j+ai,j′a ...

  5. 题解报告:hihoCoder #1175:拓扑排序·二

    题目链接:https://hihocoder.com/problemset/problem/1175 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho所在学 ...

  6. hihoCoder 1175 拓扑排序

    hihoCoder 1175 拓扑排序 描述 小Hi和小Ho所在学校的校园网被黑客入侵并投放了病毒.这事在校内BBS上立刻引起了大家的讨论,当然小Hi和小Ho也参与到了其中.从大家各自了解的情况中,小 ...

  7. 一种高效、安全的Dota全图新思路

    一种简单.安全的Dota全图新思路 作者:LC 我是一个非计算机相关专业的工科生.半年前,我构思了一种简单,安全的Dota全图新思路,经过一周的努力,把它写成了程序.应各位网友要求,在此开源,供学术交 ...

  8. [转载]只需要读内存实现的Dota全图

    我是一个非计算机相关专业的工科生.半年前,我构思了一种简单,安全的Dota全图新思路,经过一周的努力,把它写成了程序.应各位网友要求,在此开源,供学术交流. 游戏是一种封装体,开发者希望玩家看到的是游 ...

  9. 一种简单、安全的Dota全图新思路 作者:LC

    一种简单.安全的Dota全图新思路 作者:LC 我是一个非计算机相关专业的工科生.半年前,我构思了一种简单,安全的Dota全图新思路,经过一周的努力,把它写成了程序.应各位网友要求,在此开源,供学术交 ...

最新文章

  1. C#制作图片压缩工具
  2. [Android工具]安卓音乐下载软件,无损音乐FLAC音乐下载器
  3. regex_search
  4. 流放之路材质过滤怎么设置_房子装修,前置过滤器怎么选?看这6个要点
  5. 阮一峰react demo代码研究的学习笔记 - demo8 debug - click triggers state change
  6. css二级菜单的隐藏与显示_具有二级菜单的导航案例
  7. manjaro linux下载软件,manjaro linux
  8. Oracle 基础篇 --- 索引选项
  9. FreeRTOS 软件定时器使用
  10. 自动生成构造方法、getter、setter
  11. java 双向链表_数据结构-链表、栈和队列
  12. 单目摄像机标定与双目摄像机标定有什么区别
  13. python网页登录模板
  14. 网校平台对在线教育的好处
  15. matlab数值微分与数值积分
  16. BT种子的技术原理是什么?就是.torrent文件该如何理解?
  17. HDU-1849-Rabbit and Grass
  18. 怎么打开国外分享的BOX链接
  19. A_A02_003 ST-LINK驱动安装
  20. 价格表制作软件使用方法

热门文章

  1. 基金申请:关键科学问题,不是科学问题
  2. QQ邮箱一直显示正在发送或右侧联系人一直在装载
  3. 个人博客标签和文章的表结构设计
  4. 微信小程序 mark用法
  5. 企业邮箱怎么注册?企业邮箱注册流程是什么?
  6. Linux 学习路线图 #CSDN博文精选# #IT技术# #学习路线# #系统化学习#
  7. 【基础】java操作word,自动更新目录/域
  8. java2017期末考试,2017年java考试模拟试卷(2)
  9. 【XBOX360】Xbox360 RGH3.0 刷机教程
  10. java什么时候触发gc_什么时候触发 GC