WZJ的数据结构(负三十四)
难度级别:C; 运行时间限制:20000ms; 运行空间限制:262144KB; 代码长度限制:2000000B
试题描述
给一棵n个节点的树,请对于形如"u r"的Q个询问, 回答以 u 节点为中心,半径 r 以内的节点中,权值最大的节点的编号是多少。如果有多个节点,返回编号最小的。
输入
共有一组测试数据。
第一行包含一个整数 n (1 ≤ n ≤ 10^5),表示节点总数。
接下来的一行,包含 n 个数字,表示每个节点的权值 vi (1 ≤ vi ≤ 10^6)。 接下来的 n-1 行,每行三个整数 (ai, bi, wi),表示一条连接 ai, bi 节点的边,边长为 wi(1 ≤ ai, bi ≤ n, 1 ≤ wi ≤ 3)。
接下来的一行包含一个整数 q,表示询问总数(1 ≤ q ≤ 10^5)。 接下来 q 行,每行包含两个整数 u, r(1 ≤ u ≤ n, 0 ≤ r ≤300),表示询问以 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
其他说明
样例很邪恶哦。

考虑用点分治离线来解决这道题,那么问题转换成怎么解决过重心x的询问Max(val[y]|depx+depy<=r)。

我们可以用往常的做法,维护dep、val同时递增的决策序列,这个可以用平衡树来做,然后正反扫一遍。

但其实没有必要,注意x、y在同一棵子树并不会影响答案(想一想,为什么),所以只需离线构出决策序列然后二分就行了。

  1. #include<cstdio>
  2. #include<cctype>
  3. #include<queue>
  4. #include<stack>
  5. #include<cstring>
  6. #include<algorithm>
  7. #define rep(i,s,t) for(int i=s;i<=t;i++)
  8. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  9. #define ren for(int i=first[x];i;i=next[i])
  10. using namespace std;
  11. inline int read() {
  12. int x=,f=;char c=getchar();
  13. for(;!isdigit(c);c=getchar()) if(c=='-') f=-;
  14. for(;isdigit(c);c=getchar()) x=x*+c-'';
  15. return x*f;
  16. }
  17. const int maxn=;
  18. int first[maxn],next[maxn<<],to[maxn<<],dis[maxn<<],e;
  19. void AddEdge(int w,int v,int u) {
  20. to[++e]=v;dis[e]=w;next[e]=first[u];first[u]=e;
  21. to[++e]=u;dis[e]=w;next[e]=first[v];first[v]=e;
  22. }
  23. int n,q,val[maxn],ans[maxn];
  24. int better(int x,int y) {
  25. if(val[x]<val[y]||(val[x]==val[y]&&x>y)) return ;
  26. return ;
  27. }
  28. void relax(int& x,int y) {if(better(y,x)) x=y;}
  29. struct Query {
  30. int x,r,id,next;
  31. }Q[maxn];
  32. int first2[maxn],cnt;
  33. void AddQuery(int id,int r,int x) {
  34. Q[++cnt]=(Query){x,r,id,first2[x]};first2[x]=cnt;
  35. }
  36. int vis[maxn],f[maxn],s[maxn],size,root;
  37. void getroot(int x,int fa) {
  38. s[x]=;int maxs=;
  39. ren if(to[i]!=fa&&!vis[to[i]]) {
  40. getroot(to[i],x);
  41. s[x]+=s[to[i]];maxs=max(maxs,s[to[i]]);
  42. }
  43. f[x]=max(maxs,size-s[x]);
  44. if(f[root]>f[x]) root=x;
  45. }
  46. int tot,num[maxn],dep[maxn],id[maxn],A[maxn],B[maxn];
  47. void dfs(int x,int fa,int D) {
  48. num[++tot]=x;dep[tot]=D;
  49. ren if(to[i]!=fa&&!vis[to[i]]) dfs(to[i],x,D+dis[i]);
  50. }
  51. int cmp(int x,int y) {return dep[x]<dep[y]||(dep[x]==dep[y]&&val[num[x]]>val[num[y]]);}
  52. void solve(int x) {
  53. vis[x]=;tot=;dfs(x,,);
  54. rep(i,,tot) id[i]=i;
  55. sort(id+,id+tot+,cmp);
  56. int tmp=tot;tot=;
  57. rep(i,,tmp) if(better(num[id[i]],A[tot])) A[++tot]=num[id[i]],B[tot]=dep[id[i]];
  58. rep(i,,tmp) for(int j=first2[num[i]];j;j=Q[j].next) {
  59. int l=,r=tot+;
  60. while(l+<r) {
  61. int mid=l+r>>;
  62. if(B[mid]<=Q[j].r-dep[i]) l=mid;
  63. else r=mid;
  64. }
  65. if(B[l]<=Q[j].r-dep[i]) relax(ans[Q[j].id],A[l]);
  66. }
  67. ren if(!vis[to[i]]) {
  68. size=f[]=s[to[i]];getroot(to[i],root=);
  69. solve(root);
  70. }
  71. }
  72. int main() {
  73. n=read();
  74. rep(i,,n) val[i]=read();
  75. rep(i,,n) AddEdge(read(),read(),read());
  76. q=read();
  77. rep(i,,q) AddQuery(i,read(),read());
  78. size=f[]=n;getroot(,);
  79. solve(root);
  80. rep(i,,q) printf("%d\n",ans[i]);
  81. return ;
  82. }

COJ966 WZJ的数据结构(负三十四)的更多相关文章

  1. 数据结构(三十四)最短路径(Dijkstra、Floyd)

    一.最短路径的定义 在网图和非网图中,最短路径的含义是不同的.由于非网图没有边上的权值,所谓的最短路径,其实就是指两顶点之间经过的边数最少的路径:而对于网图来说,最短路径是指两顶点之间经过的边上权值之 ...

  2. COJ970 WZJ的数据结构(负三十)

    WZJ的数据结构(负三十) 难度级别:D: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给你一棵N个点的无根树,点和边上均有权值.请你设计 ...

  3. COJ968 WZJ的数据结构(负三十二)

    WZJ的数据结构(负三十二) 难度级别:D: 运行时间限制:5000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给你一棵N个点的无根树,边上均有权值,每个点上有 ...

  4. COJ 0970 WZJ的数据结构(负三十)树分治

    WZJ的数据结构(负三十) 难度级别:D: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给你一棵N个点的无根树,点和边上均有权值.请你设计 ...

  5. [COJ0968]WZJ的数据结构(负三十二)

    [COJ0968]WZJ的数据结构(负三十二) 试题描述 给你一棵N个点的无根树,边上均有权值,每个点上有一盏灯,初始均亮着.请你设计一个数据结构,回答M次操作. 1 x:将节点x上的灯拉一次,即亮变 ...

  6. [COJ0970]WZJ的数据结构(负三十)

    [COJ0970]WZJ的数据结构(负三十) 试题描述 给你一棵N个点的无根树,点和边上均有权值.请你设计一个数据结构,回答M次操作. 1 x v:对于树上的每一个节点y,如果将x.y在树上的距离记为 ...

  7. 孤荷凌寒自学python第三十四天python的文件操作对file类的对象学习

     孤荷凌寒自学python第三十四天python的文件操作对file类的对象学习 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.close() 当一个file对象执行此方法时,将关闭当前 ...

  8. NeHe OpenGL教程 第三十四课:地形

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  9. COJ 1003 WZJ的数据结构(三)ST表

    WZJ的数据结构(三) 难度级别:B: 运行时间限制:3000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 请你设计一个数据结构,完成以下功能: 给定一个大小为N的 ...

随机推荐

  1. NOIP 2011 Day 1 部分题解 (Prob#1 and Prob#2)

    Problem 1: 铺地毯 乍一看吓cry,地毯覆盖...好像是2-dims 线段树,刚开头就这么难,再一看,只要求求出一个点,果断水题,模拟即可.(注意从标号大的往小的枚举,只要有一块地毯符合要求 ...

  2. WriteFile实现下载

    TransmitFile实现下载     protected void Button1_Click(object sender, EventArgs e)      {         /*      ...

  3. ECharts2.2.0 兼容IE8

    IE 8,ECharts2.2.0 版本,demo的各个功能均正常显示在IE8上面, 但是我在真正做的时候,我的html却不能显示,画面乱了,而且function也不能用, 都准备用1.4.1版本了, ...

  4. Hadoop中操作HDFS出现异常的解决方法

    Hadoop环境搭建成功后,一般会运行一个小例子,这时候就涉及到了对HDFS文件系统的操作,对于刚开始学习Hadoop的初学者一般会多次的进行name节点的格式化操作,最后导致上传文件会抛出异常,通过 ...

  5. springMVC的一些工具类

    springMVC的一些工具类,主要有转换器,读取器 读取文件: package cn.edu.hbcf.common.springmvc; import java.util.HashMap; imp ...

  6. Androidi性能优化之高效使用内存

    应用生存期的绝大多数时间都在用于处理内存中的数据 性能主要取决于以下三个因素: a:CPU如何操作特定的数据类型 b: 数据和指令需要占用多少存储空间 c: 数据在内存中的布局 访问内存: 因为访问内 ...

  7. 重命名nginx服务器

    为了防止被黑客扫描到web服务器信息,通过相对应的web服务器信息找出对应的版本漏洞,从而对web服务器进行入侵,nginx虽然功能强大,但是也是软件,软件就可能会有漏洞,例如nginx-0.6.32 ...

  8. 扩展HtmlHelper方法

    1.在Model中新建类MyHtmlHelperExt /// <summary> /// 扩展HtmlHelper方法 /// 扩展方法三要素:静态类,静态方法,this关键字 /// ...

  9. 用于主题检测的临时日志(ba86b8a0-7ed7-4b0b-bf1f-ce41aa2a5780 - 3bfe001a-32de-4114-a6b4-4005b770f6d7)

    这是一个未删除的临时日志.请手动删除它.(ea9f667f-3be0-45c8-ad82-3acf819d571c - 3bfe001a-32de-4114-a6b4-4005b770f6d7)

  10. Ubuntu16.04 安装openjdk-7-jdk

    Ubuntu16.04 安装openjdk-7-jdk sudo apt-get install openjdk-7-jre 或者sudo apt-get install openjdk-7-jdk ...