题目描述

方方方种下了三棵树,两年后,第二棵树长出了n个节点,其中1号节点是根节点。

给定一个n个点的树

支持两种操作

方方方进行m次操作,每个操作为:

(1)给出两个数i,x,将第i个节点的子树中,与i距离为斐波那契数的节点权值+x(包括i本身)。

(2)给出一个数i,求出第i个节点的子树中,与i距离为斐波那契数的节点的权值和(包括i本身)。

题解

斐波那契数列

首先这个会被操作的只有大概25层的节点。

这样深度相同的区间在bfs序上是连续的区间,那么只要求出这样的左右端点是哪些,后面的就可以建个线段树|树状数组维护

原来我觉得这样的区间很难求。其实只要类似倍增的做法表示i的次祖先。就可以直接求了。

bfs序上的区间修改/查询 还可以用bit

这类的玩意http://www.cnblogs.com/zzqsblog/p/5692627.html

  1. #include<map>
  2. #include<stack>
  3. #include<queue>
  4. #include<cstdio>
  5. #include<string>
  6. #include<vector>
  7. #include<cstring>
  8. #include<complex>
  9. #include<iostream>
  10. #include<assert.h>
  11. #include<algorithm>
  12. using namespace std;
  13. #define inf 1001001001
  14. #define infll 1001001001001001001LL
  15. #define ll long long
  16. #define dbg(vari) cerr<<#vari<<" = "<<(vari)<<endl
  17. #define gmax(a,b) (a)=max((a),(b))
  18. #define gmin(a,b) (a)=min((a),(b))
  19. #define Ri register int
  20. #define gc getchar()
  21. #define il inline
  22. il int read(){
  23. bool f=true;Ri x=;char ch;while(!isdigit(ch=gc))if(ch=='-')f=false;while(isdigit(ch)){x=(x<<)+(x<<)+ch-'';ch=gc;}return f?x:-x;
  24. }
  25. #define gi read()
  26. #define FO(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);
  27. struct edge{
  28. int to,next;
  29. }e[];
  30. int last[],dep[],val[],f[][],cnt,n,m;
  31. ll sum;
  32. il void link(int a,int b){
  33. e[++cnt]=(edge){b,last[a]};last[a]=cnt;
  34. e[++cnt]=(edge){a,last[b]};last[b]=cnt;
  35. }
  36. int lf[][],rf[][],bfn[],_bfn;
  37. // i的fib_i层的左&右
  38. void dfs(int x,int fa=){
  39. dep[x]=dep[fa]+;
  40. f[x][]=f[x][]=fa;
  41. for(int i=;i<=;i++)f[x][i]=f[f[x][i-]][i-];
  42. for(int i=last[x];i;i=e[i].next){
  43. if(e[i].to!=fa){
  44. dfs(e[i].to,x);
  45. }
  46. }
  47. }
  48. bool vis[];
  49. void bfs(int s){
  50. memset(vis,,sizeof(vis));
  51. queue<int>q;
  52. q.push(s);vis[s]=true;bfn[]=++_bfn;
  53. while(!q.empty()){
  54. int c=q.front();q.pop();
  55. for(int i=last[c];i;i=e[i].next){
  56. if(!vis[e[i].to]){
  57. q.push(e[i].to);
  58. vis[e[i].to]=true;
  59. bfn[e[i].to]=++_bfn;
  60. }
  61. }
  62. }
  63. }
  64. void yuchuli(){
  65. dfs();
  66. bfs();
  67. memset(lf,,sizeof(lf));
  68. for(int i=;i<=n;i++){
  69. for(int j=;j<=;j++){
  70. int anc=f[i][j];
  71. if(!anc)break;
  72. gmin(lf[anc][j],bfn[i]);
  73. gmax(rf[anc][j],bfn[i]);
  74. }
  75. }
  76. for(int i=;i<=n;i++)
  77. lf[i][]=rf[i][]=bfn[i];
  78. }
  79. namespace bit{
  80. ll a1[],a2[];
  81. ll qzh(int r){
  82. ll s1=,s2=;
  83. for(int i=r;i>=;i-=i&-i) s1+=a1[i], s2+=a2[i];
  84. return (r+)*s1-s2;
  85. }
  86. ll sum(int l,int r){
  87. return qzh(r)-qzh(l-);
  88. }
  89. void edt(ll a,ll s1){
  90. ll s2=a*s1;
  91. for(;a<=n;a+=a&-a) a1[a]+=s1, a2[a]+=s2;
  92. }
  93. void edt(int l,int r,ll a) {edt(l,a); edt(r+,-a);}
  94. }
  95. void _chg(int x,int y){
  96. for(int i=;i<=;i++){
  97. if(!rf[x][i])break;
  98. bit::edt(lf[x][i],rf[x][i],y);
  99. }
  100. }
  101. ll _qry(int x){
  102. sum=;
  103. for(int i=;i<=;i++){
  104. if(!rf[x][i])break;
  105. sum=sum+bit::sum(lf[x][i],rf[x][i]);
  106. }
  107. return sum;
  108. }
  109. int main(){
  110. //FO(tree2);
  111. n=gi;m=gi;
  112. for(int i=;i<n;i++){
  113. int a,b;
  114. a=gi;b=gi;
  115. link(a,b);
  116. }
  117. yuchuli();
  118. while(m--){
  119. int op,x,y;
  120. op=gi;
  121. if(op==){
  122. x=gi;
  123. printf("%I64d\n",_qry(x));
  124. }
  125. if(op==){
  126. x=gi;y=gi;
  127. _chg(x,y);
  128. //puts("");
  129. }
  130. }
  131. }

OrzFAng系列–树 解题报告的更多相关文章

  1. 【九度OJ】题目1172:哈夫曼树 解题报告

    [九度OJ]题目1172:哈夫曼树 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1172 题目描述: 哈夫曼树,第一行输入一个数n, ...

  2. poj2528线段树解题报告,离散化+线段树

    题目网址:http://poj.org/problem?id=2528 题意: n(n<=10000)个人依次贴海报,给出每张海报所贴的范围li,ri(1<=li<=ri<=1 ...

  3. 「HNOI2016」树 解题报告

    「HNOI2016」树 事毒瘤题... 我一开始以为每次把大树的子树再接给大树,然后死活不知道咋做,心想怕不是个神仙题哦 然后看题解后才发现是把模板树的子树给大树,虽然思维上难度没啥了,但是还是很难写 ...

  4. 「SHOI2014」三叉神经树 解题报告

    「SHOI2014」三叉神经树 膜拜神仙思路 我们想做一个类似于动态dp的东西,首先得确保我们的运算有一个交换律,这样我们可以把一长串的运算转换成一块一块的放到矩阵上之类的东西,然后拿数据结构维护. ...

  5. 洛谷 P3924 康娜的线段树 解题报告

    P3924 康娜的线段树 题目描述 小林是个程序媛,不可避免地康娜对这种人类的"魔法"产生了浓厚的兴趣,于是小林开始教她\(OI\). 今天康娜学习了一种叫做线段树的神奇魔法,这种 ...

  6. [BZOJ1984]月下“毛景树”解题报告|树链剖分

    Description 毛毛虫经过及时的变形,最终逃过的一劫,离开了菜妈的菜园. 毛毛虫经过千山万水,历尽千辛万苦,最后来到了小小的绍兴一中的校园里.爬啊爬~爬啊爬~~毛毛虫爬到了一颗小小的“毛景树” ...

  7. 洛谷1087 FBI树 解题报告

    洛谷1087 FBI树 本题地址:http://www.luogu.org/problem/show?pid=1087 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全 ...

  8. 「ZJOI2019」线段树 解题报告

    「ZJOI2019」线段树 听说有人喷这个题简单,然后我就跑去做,然后自闭感++,rp++(雾) 理性分析一波,可以发现最后形成的\(2^k\)个线段树,对应的操作的一个子集,按时间顺序作用到这颗线段 ...

  9. 【九度OJ】题目1176:树查找 解题报告

    [九度OJ]题目1176:树查找 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1176 题目描述: 有一棵树,输出某一深度的所有节点 ...

随机推荐

  1. luigi学习-luigi的配置文件

    一.luigi配置文件的加载顺序 /etc/luigi/client.cfg luigi.cfg LUIGI_CONFIG_PATH环境变量 二.配置文件分节 配置文件被分为了多个section,每一 ...

  2. ElasticSearch 模板文件配置

    首先是推荐一下参考资料 中文资料:http://kibana.logstash.es/content/elasticsearch/index.html 官方文档:https://www.elastic ...

  3. LayoutInflater中四种类型inflate方法的介绍

    转自:http://blog.csdn.net/aa4790139/archive/2011/05/07/6401556.aspx 第一种: public View inflate (int reso ...

  4. ASP.NET MVC4学习笔记之Controller激活的扩展

    一. 为什么要进行扩展 在前面的分析中,我们知道默认的Controller激活系统只能实例化无参构造函数的Controller类型,但在某些情况一下,我们希望某些服务的实例能够自动注入到Control ...

  5. ASP.NET MVC4学习笔记路由系统实现

    一.路由实现 路由系统实际是一个实现了ASP.NET IHttpModule接口的模块,通过注册HttpApplication的PostResolveRequestCache 事件对Url路由处理.总 ...

  6. python中的remove趣谈

    首先我们要知道remove做的操作是顺序遍历list表,找到第一个匹配的项时删掉该项,并不会再往下找,那我们看下面的代码 mylist = [1,2,3] for i in mylist: print ...

  7. 2.html5的基本格式

    分享完html语言的核心之后,是时候开始写了.理论上,只要符合格式要求,就算是用记事本也可以写.但是,这种蛋疼且生产力低下的行为还是少做的好,选一个适合自己的IDE才是上上之选,至于哪个合适自己,那就 ...

  8. ED/EP系列6《扩展应用》

    包括:电子钱包复合应用:电子钱包灰锁应用. 1. 复合应用模式 Ø INITIALIZE FOR CAPP PURCHASE(复合应用消费初始化): Ø UPDATE CAPP DATA CACHE( ...

  9. [原创]PostgreSQL Plus Advince Server在 HA环境中一对多的Stream Replication配置(四)

    八.HA环境下配置多节点的sshVIP(s1):[root@s1 ~]# mkdir /opt/PostgresPlus/9.2AS/.ssh[root@s1 ~]# chown enterprise ...

  10. <转载>编程珠玑-位排序(bitsort)

    转载:http://www.cnblogs.com/shuaiwhu/archive/2011/05/29/2065039.html  维护版权   在<编程珠玑>一书上,有一题是将一堆不 ...