题意:有一棵N个点的树,每个点有一个点权a[i],要求在线实现以下操作:

1:将X号点的点权修改为Y

2:查询X到Y的路径上第K大的点权

n,q<=80000 a[i]<=10^8

思路:此题明显地体现了我对主席树理解不深

树上路径K大可以直接用树剖+二分答案+树做

但DFS序+主席树也可以

对于点U,它能影响DFS序上的区间(st[u],ed[u])

所以维护方法就是类似序列K大一样 s[st[u]]++ s[ed[u]+1]--

对于路径(x,y),信息为s[x]+s[y]-s[lca(x,y)]-s[fa[lca(x,y)]]

但因为是在树上的操作,所以每个点是从它在树上的父亲继承下来的,并不是DFS序上的前一个继承的

所以在DFS时就可以建立一棵没有修改过的原树

对于询问,再建立一棵树只做更改,询问时加上原树的信息即可

不开两棵树可以,不过需要主席树合并

  1. var t:array[..]of record
  2. l,r,s:longint;
  3. end;
  4. f:array[..,..]of longint;
  5. head,vet,next,st,ed,dep,flag,hash,root1,root2,b:array[..]of longint;
  6. d:array[..,..]of longint;
  7. a:array[..]of longint;
  8. q1,q2:array[..]of longint;
  9. n,m,i,j,tot,time,up,la,lb,cnt,q,x,y,tmp,p,sum,z,f1,f2,f3,f4:longint;
  10.  
  11. procedure add(a,b:longint);
  12. begin
  13. inc(tot);
  14. next[tot]:=head[a];
  15. vet[tot]:=b;
  16. head[a]:=tot;
  17. end;
  18.  
  19. function max(x,y:longint):longint;
  20. begin
  21. if x>y then exit(x);
  22. exit(y);
  23. end;
  24.  
  25. procedure swap(var x,y:longint);
  26. var t:longint;
  27. begin
  28. t:=x; x:=y; y:=t;
  29. end;
  30.  
  31. function find(x:longint):longint;
  32. var l,r,mid:longint;
  33. begin
  34. l:=; r:=up;
  35. while l<=r do
  36. begin
  37. mid:=(l+r)>>;
  38. if hash[mid]=x then exit(mid);
  39. if hash[mid]<x then l:=mid+
  40. else r:=mid-;
  41. end;
  42. end;
  43.  
  44. procedure update(l,r:longint;var p:longint;v,x:longint);
  45. var mid:longint;
  46. begin
  47. inc(cnt); t[cnt]:=t[p];
  48. p:=cnt; t[p].s:=t[p].s+x;
  49. if l=r then exit;
  50. mid:=(l+r)>>;
  51. if v<=mid then update(l,mid,t[p].l,v,x)
  52. else update(mid+,r,t[p].r,v,x);
  53. end;
  54.  
  55. procedure dfs(u:longint);
  56. var e,v,i,tmp:longint;
  57. begin
  58. for i:= to do
  59. begin
  60. if dep[u]<(<<i) then break;
  61. f[u,i]:=f[f[u,i-],i-];
  62. end;
  63. tmp:=find(a[u]);
  64. root1[u]:=root1[f[u,]];
  65. update(,up,root1[u],tmp,);
  66. inc(time); st[u]:=time; ed[u]:=time;
  67. flag[u]:=;
  68. e:=head[u];
  69. while e<> do
  70. begin
  71. v:=vet[e];
  72. if flag[v]= then
  73. begin
  74. f[v,]:=u;
  75. dep[v]:=dep[u]+;
  76. dfs(v);
  77. ed[u]:=max(ed[u],ed[v]);
  78. end;
  79. e:=next[e];
  80. end;
  81. end;
  82.  
  83. function lca(x,y:longint):longint;
  84. var d,i:longint;
  85. begin
  86. if dep[x]<dep[y] then swap(x,y);
  87. d:=dep[x]-dep[y];
  88. for i:= to do
  89. if d and (<<i)> then x:=f[x,i];
  90. for i:= downto do
  91. if f[x,i]<>f[y,i] then
  92. begin
  93. x:=f[x,i]; y:=f[y,i];
  94. end;
  95. if x=y then exit(x);
  96. exit(f[x,]);
  97. end;
  98.  
  99. procedure qsort(l,r:longint);
  100. var i,j,mid:longint;
  101. begin
  102. i:=l; j:=r; mid:=b[(l+r)>>];
  103. repeat
  104. while mid>b[i] do inc(i);
  105. while mid<b[j] do dec(j);
  106. if i<=j then
  107. begin
  108. swap(b[i],b[j]);
  109. inc(i); dec(j);
  110. end;
  111. until i>j;
  112. if l<j then qsort(l,j);
  113. if i<r then qsort(i,r);
  114. end;
  115.  
  116. function lowbit(x:longint):longint;
  117. begin
  118. exit(x and (-x));
  119. end;
  120.  
  121. function query(l,r,k:longint):longint;
  122. var s1,s2,i,mid:longint;
  123. begin
  124. if l=r then exit(l);
  125. mid:=(l+r)>>;
  126. s1:=; s2:=;
  127. for i:= to la do s1:=s1+t[t[q1[i]].l].s;
  128. for i:= to lb do s2:=s2+t[t[q2[i]].l].s;
  129. s2:=s2+t[t[f1].l].s+t[t[f2].l].s;
  130. s1:=s1+t[t[f3].l].s+t[t[f4].l].s;
  131. if s2-s1>=k then
  132. begin
  133. f1:=t[f1].l; f2:=t[f2].l;
  134. f3:=t[f3].l; f4:=t[f4].l;
  135. for i:= to la do q1[i]:=t[q1[i]].l;
  136. for i:= to lb do q2[i]:=t[q2[i]].l;
  137. exit(query(l,mid,k));
  138. end
  139. else
  140. begin
  141. f1:=t[f1].r; f2:=t[f2].r;
  142. f3:=t[f3].r; f4:=t[f4].r;
  143. for i:= to la do q1[i]:=t[q1[i]].r;
  144. for i:= to lb do q2[i]:=t[q2[i]].r;
  145. exit(query(mid+,r,k-(s2-s1)));
  146. end;
  147. end;
  148.  
  149. begin
  150. assign(input,'data.in'); reset(input);
  151. assign(output,'tyvj2133.out'); rewrite(output);
  152. read(n,m);
  153. for i:= to n do
  154. begin
  155. read(a[i]); b[i]:=a[i];
  156. end;
  157. q:=n;
  158. for i:= to n- do
  159. begin
  160. read(x,y);
  161. add(x,y);
  162. add(y,x);
  163. end;
  164.  
  165. for i:= to m do
  166. for j:= to do read(d[i,j]);
  167. for i:= to m do
  168. if d[i,]= then
  169. begin
  170. inc(q); b[q]:=d[i,];
  171. end;
  172. qsort(,q);
  173. hash[]:=b[]; up:=;
  174. for i:= to q do
  175. if b[i]<>b[i-] then begin inc(up); hash[up]:=b[i]; end;
  176. dfs();
  177.  
  178. for i:= to m do
  179. if d[i,]= then
  180. begin
  181. tmp:=find(a[d[i,]]);
  182. j:=st[d[i,]];
  183. while j<=n do
  184. begin
  185. update(,up,root2[j],tmp,-);
  186. j:=j+lowbit(j);
  187. end;
  188. j:=ed[d[i,]]+;
  189. while j<=n do
  190. begin
  191. update(,up,root2[j],tmp,);
  192. j:=j+lowbit(j);
  193. end;
  194. tmp:=find(d[i,]);
  195. j:=st[d[i,]];
  196. while j<=n do
  197. begin
  198. update(,up,root2[j],tmp,);
  199. j:=j+lowbit(j);
  200. end;
  201. j:=ed[d[i,]]+;
  202. while j<=n do
  203. begin
  204. update(,up,root2[j],tmp,-);
  205. j:=j+lowbit(j);
  206. end;
  207.  
  208. a[d[i,]]:=d[i,];
  209. end
  210. else
  211. begin
  212. la:=; lb:=; p:=lca(d[i,],d[i,]);
  213. j:=st[d[i,]];
  214. while j> do
  215. begin
  216. inc(lb); q2[lb]:=root2[j];
  217. j:=j-lowbit(j);
  218. end;
  219.  
  220. j:=st[d[i,]];
  221. while j> do
  222. begin
  223. inc(lb); q2[lb]:=root2[j];
  224. j:=j-lowbit(j);
  225. end;
  226.  
  227. j:=st[p];
  228. while j> do
  229. begin
  230. inc(la); q1[la]:=root2[j];
  231. j:=j-lowbit(j);
  232. end;
  233.  
  234. j:=st[f[p,]];
  235. while j> do
  236. begin
  237. inc(la); q1[la]:=root2[j];
  238. j:=j-lowbit(j);
  239. end;
  240.  
  241. f1:=root1[d[i,]]; f2:=root1[d[i,]];
  242. f3:=root1[p]; f4:=root1[f[p,]];
  243. sum:=dep[d[i,]]+dep[d[i,]]-dep[p]*+;
  244. z:=sum-d[i,]+;
  245. if sum<d[i,] then writeln('invalid request!')
  246. else writeln(hash[query(,up,z)]);
  247. end;
  248.  
  249. close(input);
  250. close(output);
  251. end.

【Tyvj2133&BZOJ1146】网络管理Network(树套树,DFS序,树状数组,主席树,树上差分)的更多相关文章

  1. 【bzoj1146】[CTSC2008]网络管理Network 倍增LCA+dfs序+树状数组+主席树

    题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条高 ...

  2. zoj2112 树状数组+主席树 区间动第k大

    Dynamic Rankings Time Limit: 10000MS   Memory Limit: 32768KB   64bit IO Format: %lld & %llu Subm ...

  3. BZOJ_2120_数颜色_Set+树状数组+主席树

    BZOJ_2120_数颜色_Set+树状数组+主席树 Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L ...

  4. BZOJ_1901_Zju2112 Dynamic Rankings_树状数组+主席树

    BZOJ_1901_Zju2112 Dynamic Rankings_树状数组+主席树 题意: 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i, ...

  5. 【bzoj3744】Gty的妹子序列 分块+树状数组+主席树

    题目描述 我早已习惯你不在身边, 人间四月天 寂寞断了弦. 回望身后蓝天, 跟再见说再见…… 某天,蒟蒻Autumn发现了从 Gty的妹子树(bzoj3720) 上掉落下来了许多妹子,他发现 她们排成 ...

  6. P1972 [SDOI2009]HH的项链[离线+树状数组/主席树/分块/模拟]

    题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的贝壳,因此,他的项链 ...

  7. 【BZOJ】1146: [CTSC2008]网络管理Network(树链剖分+线段树套平衡树+二分 / dfs序+树状数组+主席树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1146 第一种做法(时间太感人): 第二种做法(rank5,好开心) ================ ...

  8. [BZOJ 1146] [CTSC2008]网络管理Network(树状数组+主席树)

    题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条高 ...

  9. [luogu2617][bzoj1901][Zju2112]Dynamic Rankings【树套树+树状数组+主席树】

    题目网址 [传送门] 题目大意 请你设计一个数据结构,支持单点修改,区间查询排名k. 感想(以下省略脏话inf个字) 真的强力吹爆洛谷数据,一般的树套树还给我T了一般的点,加强的待修主席树还给我卡了几 ...

  10. hdu_5788_Level Up(树状数组+主席树)

    题目链接:hdu_5788_Level Up 题意: 有一棵树,n个节点,每个节点有个能力值A[i],mid[i],mid的值为第i节点的子树的中位数(包括本身),现在让你将其中的一个节点的A值改为1 ...

随机推荐

  1. java基础—流

    一.JAVA流式输入/输出原理

  2. python - 辨识alert、window以及操作

    selenium之 辨识alert.window以及操作 原创 2016年08月24日 11:01:04 4820 0 2 更多关于python selenium的文章,请关注我的专栏:Python ...

  3. Oracle 闪回 找回数据的实现方法

    Oracle 闪回 找回数据的实现方法 闪回技术是Oracle强大数据库备份恢复机制的一部分,在数据库发生逻辑错误的时候,闪回技术能提供快速且最小损失的恢复.这篇文章主要介绍了Oracle 闪回 找回 ...

  4. Linux 、AIX环境下查看oracle配置信息(service_name、SID、tnsname)。

    SID: echo $ORACLE_SID service_name: sqlplus / as sysdba; show parameter instance_name; show paramete ...

  5. Java开发小游戏 用键盘控制精灵在游戏中上下左右跑动 窗体小游戏可打包下载,解压后双击start运行

    package com.swift; import java.awt.Point; import java.awt.event.KeyEvent; import com.rupeng.game.Gam ...

  6. 【线性基】bzoj2844: albus就是要第一个出场

    线性基求可重rank 题目描述 给定 n 个数 $\{ a_i \}$ ,以及数 $x$. 将 $\{ a_i \}$​ 的所有子集(包括空集)的异或值从小到大排序,得到 $\{ b_i \} $. ...

  7. 201621123080《Java程序设计》第12周学习总结

    201621123080<Java程序设计>第12周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 面向系统综合设计-图书馆管理系 ...

  8. tomcat报错:java.io.IOException: 您的主机中的软件中止了一个已建立的连接。

    tomcat报错: org.apache.catalina.connector.ClientAbortException: java.io.IOException: 您的主机中的软件中止了一个已建立的 ...

  9. python-matplotlib-lec0

    直奔主题吧..以下是对matplotlib画图的简单讲解,代码已测试. win7 + pycharm + python 2.7 参考文档: http://old.sebug.net/paper/boo ...

  10. hdu4489 组合公式+dp

    这里对于题意在说明一下, 题目中要求的排列必须是波浪形,每一个在排列中的人不是波峰就是波谷,如果它既不是波峰也不是波谷排列就是错的. 对于我这种数学渣渣来说,做一道dp题要好久,%>_<% ...