为了方便才用lct,没想到最后要加读入优化才能过...

有一个结论就是在一条链上,如果能找到一个点使得这个点划分链左右两边的树节点权值和最相近,那么这个点就是答案

用lct维护,每个splay节点存树节点权值$v_x$,树边权值$w_x$,splay中最左节点权值$lv_x$,最右节点权值$rv_x$,树节点权值和$sv_x$,树边权值和$sw_x$,这棵子树向左贡献的答案$pl_x$,这棵子树向右贡献的答案$pr_x$

对于每个询问,先把对应的链提取出来,然后在这棵splay上二分找到分两边点权和最平均的点(二分过程用$sv$和$lv$判断),找到点之后就可以直接输出答案了

修改直接修改

  1. #include<stdio.h>
  2. #define NUM(x) (48<=x&&x<=57)
  3. char c[21000000]={0};
  4. int ns=0;
  5. inline int rd(){
  6. while(!NUM(c[ns]))ns++;
  7. int q=0;
  8. while(NUM(c[ns]))q=(q<<3)+(q<<1)+c[ns++]-48;
  9. return q;
  10. }
  11. #define ll long long
  12. int fa[320010],ch[320010][2],r[320010];
  13. ll v[320010],lv[320010],rv[320010],w[320010],sv[320010],sw[320010],pl[320010],pr[320010];
  14. #define ls ch[x][0]
  15. #define rs ch[x][1]
  16. void pushup(int x){
  17. lv[x]=ls?lv[ls]:v[x];
  18. rv[x]=rs?rv[rs]:v[x];
  19. sv[x]=sv[ls]+sv[rs]+v[x];
  20. sw[x]=sw[ls]+sw[rs]+w[x];
  21. pl[x]=pl[ls]+pl[rs]+v[x]*sw[ls]+(sw[ls]+w[x])*sv[rs];
  22. pr[x]=pr[ls]+pr[rs]+v[x]*sw[rs]+(sw[rs]+w[x])*sv[ls];
  23. }
  24. templatevoid swap(C&a,C&b){
  25. C c=a;
  26. a=b;
  27. b=c;
  28. }
  29. void rev(int x){
  30. r[x]^=1;
  31. swap(lv[x],rv[x]);
  32. swap(pl[x],pr[x]);
  33. swap(ls,rs);
  34. }
  35. void pushdown(int x){
  36. if(r[x]){
  37. if(ls)rev(ls);
  38. if(rs)rev(rs);
  39. r[x]=0;
  40. }
  41. }
  42. void rot(int x){
  43. int y,z,f,b;
  44. y=fa[x];
  45. z=fa[y];
  46. f=ch[y][0]==x;
  47. b=ch[x][f];
  48. fa[x]=z;
  49. fa[y]=x;
  50. if(b)fa[b]=y;
  51. ch[x][f]=y;
  52. ch[y][f^1]=b;
  53. if(ch[z][0]==y)ch[z][0]=x;
  54. if(ch[z][1]==y)ch[z][1]=x;
  55. pushup(y);
  56. pushup(x);
  57. }
  58. bool isrt(int x){return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;}
  59. void gao(int x){
  60. if(!isrt(x))gao(fa[x]);
  61. pushdown(x);
  62. }
  63. void splay(int x){
  64. int y,z;
  65. gao(x);
  66. while(!isrt(x)){
  67. y=fa[x];
  68. z=fa[y];
  69. if(!isrt(y))rot((ch[z][0]==y&&ch[y][0]==x)||(ch[z][1]==y&&ch[y][1]==x)?y:x);
  70. rot(x);
  71. }
  72. }
  73. void access(int x){
  74. int y=0;
  75. while(x){
  76. splay(x);
  77. rs=y;
  78. pushup(x);
  79. y=x;
  80. x=fa[x];
  81. }
  82. }
  83. void makert(int x){
  84. access(x);
  85. splay(x);
  86. rev(x);
  87. }
  88. void link(int x,int y){
  89. makert(x);
  90. fa[x]=y;
  91. }
  92. int find(int x,ll d){
  93. pushdown(x);
  94. if(sv[ls]+v[x]>d)return find(ls,d);
  95. d-=sv[ls]+v[x];
  96. if(rs&&lv[rs]<=d)return find(rs,d);
  97. return x;
  98. }
  99. ll query(int x,int y){
  100. makert(x);
  101. access(y);
  102. splay(x);
  103. if(lv[x]<=sv[x]>>1){
  104. x=find(x,sv[x]>>1);
  105. splay(x);
  106. x=rs;
  107. }
  108. pushdown(x);
  109. while(ls){
  110. x=ls;
  111. pushdown(x);
  112. }
  113. splay(x);
  114. return pr[ls]+pl[rs];
  115. }
  116. int main(){
  117. int len=fread(c,1,21000000,stdin);
  118. c[len]=0;
  119. int n,q,i,x,y;
  120. n=rd();
  121. for(i=1;i<=n;i++){
  122. v[i]=rd();
  123. pushup(i);
  124. }
  125. for(i=1;i<n;i++){
  126. x=rd();
  127. y=rd();
  128. w[n+i]=rd();
  129. pushup(n+i);
  130. link(x,n+i);
  131. link(n+i,y);
  132. }
  133. q=rd();
  134. while(q--){
  135. i=rd();
  136. x=rd();
  137. y=rd();
  138. if(i==1)
  139. printf("%lld\n",query(x,y));
  140. else{
  141. splay(x);
  142. v[x]=y;
  143. pushup(x);
  144. }
  145. }
  146. }

[Contest20180313]灵大会议的更多相关文章

  1. sharepoint 增删改查

    前端提交 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="MeetingOneW ...

  2. nodejs实现Websocket的数据接收发送

    在去年的时候,写过一篇关于websocket的博文:http://www.cnblogs.com/axes/p/3586132.html ,里面主要是借助了nodejs-websocket这个插件,后 ...

  3. 异步编程之Promise(2):探究原理

    异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...

  4. HTML+CSS Day11产品网站

    1.佰亿首页 效果图: 代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "ht ...

  5. async和enterproxy控制并发数量

    聊聊并发与并行 并发我们经常提及之,不管是web server,app并发无处不在,操作系统中,指一个时间段中几个程序处于已经启动运行到完毕之间,且这几个程序都是在同一处理机上运行,并且任一个时间点只 ...

  6. Selenium 4即将发布:每个QA都应该知道的

    阅读原文 Simon Stewart(Selenium的创始成员)在班加罗尔的Selenium大会议上正式确认了Selenium4.0的发布日期和一些主要更新.我们先来提前了解一下Selenium 4 ...

  7. ICML 2018 | 从强化学习到生成模型:40篇值得一读的论文

    https://blog.csdn.net/y80gDg1/article/details/81463731 感谢阅读腾讯AI Lab微信号第34篇文章.当地时间 7 月 10-15 日,第 35 届 ...

  8. 「About Blockchain(一)」达沃斯年会上的区块链

    「About Blockchain(一)」 --达沃斯年会上的区块链 写在前面:1月23日到26日,在瑞士达沃斯召开了第48届世界经济论坛.这个新闻本没有引起我格外的关注,直到前两天张老师分享给我一篇 ...

  9. Teamwork#3,Week5,Scrum Meeting 11.20

    到目前为止,第一轮迭代已经基本完成.由于时间问题,多店比较的高级功能要放到第二轮迭代实现. 大部分任务已经完成,在alpha版本发布之前我们剩余需要解决的问题有两个: 服务器.校园网服务器不能满足我们 ...

随机推荐

  1. bzoj1814 Ural 1519 Formula 1(插头dp模板题)

    1814: Ural 1519 Formula 1 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 924  Solved: 351[Submit][Sta ...

  2. 移动端去掉a标签点击时出现的背景

    之前做移动端的Portal时,手机上测试,点击a标签总是出现一个背景框 在CSS中添加 -webkit-tap-highlight-color: rgba(0, 0, 0, 0);就可以了 a:act ...

  3. DIV的变高与变宽

    代码: <!DOCTYPE HTML><html><head> <meta charset="utf-8"> <title&g ...

  4. 说明exit()函数作用的程序

    // algo1-4.cpp 说明exit()函数作用的程序 #include"c1.h" int a(int i) { if(i==1) { printf("退出程序的 ...

  5. 转:A Painless Q-learning Tutorial (一个 Q-learning 算法的简明教程)

    demo 参见 MDP DEMO   本文是对 http://mnemstudio.org/path-finding-q-learning-tutorial.htm 的翻译,共分两部分,第一部分为中文 ...

  6. [转]华 使用npm安装一些包失败了的看过来(npm国内镜像介绍)

     发布于 5 年前  作者 wppept  275957 次浏览  最后一次编辑是 1 年前 这个也是网上搜的,亲自试过,非常好用! 镜像使用方法(三种办法任意一种都能解决问题,建议使用第三种,将配置 ...

  7. bzoj 2668 费用流

    我们可以把初始状态转化为目标状态这一约束转化为将黑子移动到目标状态所需要的最少步数. 除了初始点和目标点之外,剩下的点如果被经过那么就会被交换两次,所以我们将一个点拆成3个点,a,b,c,新建附加源点 ...

  8. RtlInitUnicodeString

    代码1: WCHAR enumeratorName[] = {}; UNICODE_STRING unicodeEnumName; RtlInitUnicodeString(&unicodeE ...

  9. HDU1174(空间点到直线的距离,用叉积)

    爆头 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submissi ...

  10. android usb adb流程[转]

    android adb 概述 android adb的代码分为两部分: kernel层的代码在如下路径: drivers/usb/gadget/f_adb.c drivers/usb/gadget/a ...