$n \leq 100000$的树支持$m \leq 100000$个操作:每个点有两个权值$a$和$b$,一,链加;二,链上$b_i+=a_i*d$,问最后所有的$b_i$。

这个题我在看到之前有想过链上的情况,当时以为标记是O(1)下传的就没细想。现在看来需要一些特殊技巧。首先链剖加线段树。

方法一:把$a$的区间加标记永久化,然后记标记:$b$的区间共同增量;$b$的区间增加次数。下传时,$a$不下传,次数直接加给儿子后清零,增量$zeng_{son}+=zeng_{fa}+abiaoji_{son}*cishu_{fa}$。最后所有标记一起推下去。

方法二:可用一个矩阵进行一次操作:转自此

  1 //#include<iostream>
  2 #include<cstring>
  3 #include<cstdio>
  4 //#include<time.h>
  5 //#include<complex>
  6 //#include<set>
  7 #include<queue>
  8 //#include<vector>
  9 #include<algorithm>
 10 #include<stdlib.h>
 11 using namespace std;
 12
 13 #define LL long long
 14 int qread()
 15 {
 16     char c; int s=0,f=1; while ((c=getchar())<'0' || c>'9') (c=='-') && (f=-1);
 17     do s=s*10+c-'0'; while ((c=getchar())>='0' && c<='9'); return s*f;
 18 }
 19
 20 //Pay attention to '-' , LL and double of qread!!!!
 21
 22 int n,m;
 23 #define maxn 200011
 24
 25 struct Edge{int to,next;}edge[maxn<<1]; int first[maxn],le=2;
 26 void in(int x,int y) {Edge &e=edge[le]; e.to=y; e.next=first[x]; first[x]=le++;}
 27
 28 int fa[maxn],id[maxn],top[maxn],dep[maxn],size[maxn],hea[maxn],Time=0,list[maxn];
 29 void dfs1(int x)
 30 {
 31     size[x]=1;
 32     for (int i=first[x];i;i=edge[i].next)
 33     {
 34         Edge &e=edge[i];
 35         dep[e.to]=dep[x]+1; fa[e.to]=x;
 36         dfs1(e.to);
 37         size[x]+=size[e.to]; if (size[e.to]>size[hea[x]]) hea[x]=e.to;
 38     }
 39 }
 40 void dfs2(int x,int from)
 41 {
 42     top[x]=from; id[x]=++Time; list[Time]=x;
 43     if (hea[x]) dfs2(hea[x],from);
 44     for (int i=first[x];i;i=edge[i].next)
 45     {
 46         Edge &e=edge[i]; if (e.to==hea[x]) continue;
 47         dfs2(e.to,e.to);
 48     }
 49 }
 50
 51 LL ans[maxn];
 52 struct SMT
 53 {
 54     struct Node
 55     {
 56         int ls,rs;
 57         LL sv,st,nt;
 58     }a[maxn<<1];
 59     int size,n;
 60     void build(int &x,int L,int R)
 61     {
 62         x=++size; if (L==R) return;
 63         int mid=(L+R)>>1;
 64         build(a[x].ls,L,mid); build(a[x].rs,mid+1,R);
 65     }
 66     void clear(int N) {n=N; size=0; int x; build(x,1,n);}
 67     void addsingle(int x,LL fst,LL fnt)
 68     {
 69         a[x].st+=fst+a[x].sv*fnt;
 70         a[x].nt+=fnt;
 71     }
 72     void down(int x)
 73     {addsingle(a[x].ls,a[x].st,a[x].nt); addsingle(a[x].rs,a[x].st,a[x].nt); a[x].st=a[x].nt=0;}
 74     int ql,qr,d; LL vv;
 75     void OP1(int x,int L,int R)
 76     {
 77         if (ql<=L && R<=qr) {a[x].sv+=d; return;}
 78         down(x);
 79         int mid=(L+R)>>1;
 80         if (ql<=mid) OP1(a[x].ls,L,mid);
 81         if (qr>mid) OP1(a[x].rs,mid+1,R);
 82     }
 83     void op1(int L,int R,int d) {ql=L; qr=R; this->d=d; OP1(1,1,n);}
 84     void OP2(int x,int L,int R)
 85     {
 86         if (ql<=L && R<=qr) {a[x].st+=(vv+a[x].sv)*d; a[x].nt+=d; return;}
 87         down(x); vv+=a[x].sv;
 88         int mid=(L+R)>>1;
 89         if (ql<=mid) OP2(a[x].ls,L,mid);
 90         if (qr>mid) OP2(a[x].rs,mid+1,R);
 91         vv-=a[x].sv;
 92     }
 93     void op2(int L,int R,int d) {ql=L; qr=R; this->d=d; vv=0; OP2(1,1,n);}
 94
 95     void dfs(int x,int L,int R)
 96     {
 97         if (L==R)
 98         {
 99             int u=list[L];
100             ans[u]=a[x].st;
101             return;
102         }
103         down(x);
104         int mid=(L+R)>>1;
105         dfs(a[x].ls,L,mid); dfs(a[x].rs,mid+1,R);
106     }
107     void dfs() {dfs(1,1,n);}
108 }t;
109
110 void ope(int x,int y,int d,int type)
111 {
112     while (top[x]!=top[y])
113     {
114         if (dep[top[x]]<dep[top[y]]) x^=y^=x^=y;
115         if (type==1) t.op1(id[top[x]],id[x],d);
116         else t.op2(id[top[x]],id[x],d);
117         x=fa[top[x]];
118     }
119     if (dep[x]>dep[y]) x^=y^=x^=y;
120     if (type==1) t.op1(id[x],id[y],d);
121     else t.op2(id[x],id[y],d);
122 }
123
124 int main()
125 {
126     n=qread();
127     for (int i=2,x;i<=n;i++) {x=qread(); in(x,i);}
128     dfs1(1); dfs2(1,1);
129
130     t.clear(n);
131     m=qread();
132     int op,x,d;
133     while (m--)
134     {
135         op=qread(); x=qread(); d=qread();
136         ope(1,x,d,op);
137     }
138     t.dfs();
139     for (int i=1;i<=n;i++) printf("%lld\n",ans[i]);
140     return 0;
141 }

View Code

转载于:https://www.cnblogs.com/Blue233333/p/9169168.html

51nod1462 树据结构相关推荐

  1. 用中值排序基数法实现树状结构 (转)

    在BBS的编写中,经常有人问怎样实现树状结构?一个比较不负责任的回答是:使用递归算法.当然,递归是一个可行的办法 (二叉树的历遍也好象只能使用递归算法),但对于BBS来说,这样做势必要进行大量的Sql ...

  2. dtree和jquery构建树型结构

    对于小型的树型应用来说,dtree是一个不错的选择. 先看一眼dtree给的例子 构造静态树 首先引入css文件和js文件 <link rel="StyleSheet" hr ...

  3. 递归查询树状结构某个确定的节点

    递归 递归算法在日常工作中算是用的比较多的一种,比如DOM树的遍历,多层级树状结构的生成,遍历寻找某个树节点等 1 先来看下数据结构 var result = {id:0,name:"张飞& ...

  4. 【唠叨两句】如何将一张树型结构的Excel表格中的数据导入到多张数据库表中...

    小弟昨天遇到一个相对比较棘手的问题,就像标题说的那样.如何将一张树型结构的Excel表格中的数据导入到多张数据库表中,在现实中实际是七张数据库表,这七张表之间有着有着相对比较复杂的主外键关系,对于我这 ...

  5. 系统管理模块_部门管理_设计(映射)本模块中的所有实体并总结设计实体的技巧_懒加载异常问题_树状结构...

    系统管理模块_部门管理_设计本模块中的所有实体并总结设计实体的技巧 设计实体流程 1,有几个实体? 一般是一组增删改查对应一个实体. 2,实体之间有什么关系? 一般是页面引用了其他的实体时,就表示与这 ...

  6. LSM树——LSM 将B+树等结构昂贵的随机IO变的更快,而代价就是读操作要处理大量的索引文件(sstable)而不是一个,另外还是一些IO被合并操作消耗。...

    Basic Compaction 为了保持LSM的读操作相对较快,维护并减少sstable文件的个数是很重要的,所以让我们更深入的看一下合并操作.这个过程有一点儿像一般垃圾回收算法. 当一定数量的ss ...

  7. SDUT 2127 树-堆结构练习——合并果子之哈夫曼树(优先队列)

    树-堆结构练习--合并果子之哈夫曼树 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description ...

  8. file类打印目录---树状结构,递归

    package Test; import java.io.File; /** * file类打印目录---树状结构,递归 * @author Administrator * */ public cla ...

  9. 数据结构32:树存储结构

    之前介绍的所有的数据结构都是线性存储结构.本章所介绍的树结构是一种非线性存储结构,存储的是具有"一对多"关系的数据元素的集合. (A)                       ...

最新文章

  1. R语言命令行写linux,linux命令行下使用R语言绘图实例讲解
  2. Linux Shell常用技巧(九) 系统运行进程
  3. Python 序列操作之切片
  4. 伦敦大学金史密斯学院计算机专业,伦敦大学金史密斯学院 Goldsmiths, University of London...
  5. springboot 系列技术教程目录
  6. 计算机语言中字体的设置,font-style字体设置详解
  7. 宝宝头三年影响一生[转]
  8. java网络通信:伪异步I/O编程(PIO)
  9. Linux与windows的软/硬链接
  10. [转载] python3.5 利用openpyxl模块来处理excel表
  11. js 控制鼠标_原生js实现改变视频播放速率
  12. Network In Network论文笔记
  13. Java调用ffmepg+mencoder视频格式转换(*)
  14. android sms 接收短信,Android SMS 短信操作
  15. HDOJ 1847Good Luck in CET-4 Everybody!(巴士博弈)
  16. 修改android默认锁屏方式
  17. python求素数平均值_用python怎么求素数
  18. YYDS!使用 Python 全面分析股票数据特征
  19. 查询彩票中奖号码小程序
  20. 商业模式-创新-增值价值

热门文章

  1. html箭头相关符号
  2. 重写Github的TreeTableView库实现定制显示子节点
  3. 点亮科技树——锂离子电池
  4. JavaFX调用虚拟键盘
  5. 2020美亚杯个人赛
  6. 分子动力学模拟之SETTLE约束算法
  7. 生物信息学测序之常见测序方法DNA文库构建
  8. HDMI 2.0概述
  9. 首批接入司法数据的网贷平台已拒贷3万余失信被执行人
  10. 中英文颜色RGB数值对照表(python cv2)