51nod1462 树据结构
$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 树据结构相关推荐
- 用中值排序基数法实现树状结构 (转)
在BBS的编写中,经常有人问怎样实现树状结构?一个比较不负责任的回答是:使用递归算法.当然,递归是一个可行的办法 (二叉树的历遍也好象只能使用递归算法),但对于BBS来说,这样做势必要进行大量的Sql ...
- dtree和jquery构建树型结构
对于小型的树型应用来说,dtree是一个不错的选择. 先看一眼dtree给的例子 构造静态树 首先引入css文件和js文件 <link rel="StyleSheet" hr ...
- 递归查询树状结构某个确定的节点
递归 递归算法在日常工作中算是用的比较多的一种,比如DOM树的遍历,多层级树状结构的生成,遍历寻找某个树节点等 1 先来看下数据结构 var result = {id:0,name:"张飞& ...
- 【唠叨两句】如何将一张树型结构的Excel表格中的数据导入到多张数据库表中...
小弟昨天遇到一个相对比较棘手的问题,就像标题说的那样.如何将一张树型结构的Excel表格中的数据导入到多张数据库表中,在现实中实际是七张数据库表,这七张表之间有着有着相对比较复杂的主外键关系,对于我这 ...
- 系统管理模块_部门管理_设计(映射)本模块中的所有实体并总结设计实体的技巧_懒加载异常问题_树状结构...
系统管理模块_部门管理_设计本模块中的所有实体并总结设计实体的技巧 设计实体流程 1,有几个实体? 一般是一组增删改查对应一个实体. 2,实体之间有什么关系? 一般是页面引用了其他的实体时,就表示与这 ...
- LSM树——LSM 将B+树等结构昂贵的随机IO变的更快,而代价就是读操作要处理大量的索引文件(sstable)而不是一个,另外还是一些IO被合并操作消耗。...
Basic Compaction 为了保持LSM的读操作相对较快,维护并减少sstable文件的个数是很重要的,所以让我们更深入的看一下合并操作.这个过程有一点儿像一般垃圾回收算法. 当一定数量的ss ...
- SDUT 2127 树-堆结构练习——合并果子之哈夫曼树(优先队列)
树-堆结构练习--合并果子之哈夫曼树 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description ...
- file类打印目录---树状结构,递归
package Test; import java.io.File; /** * file类打印目录---树状结构,递归 * @author Administrator * */ public cla ...
- 数据结构32:树存储结构
之前介绍的所有的数据结构都是线性存储结构.本章所介绍的树结构是一种非线性存储结构,存储的是具有"一对多"关系的数据元素的集合. (A) ...
最新文章
- R语言命令行写linux,linux命令行下使用R语言绘图实例讲解
- Linux Shell常用技巧(九) 系统运行进程
- Python 序列操作之切片
- 伦敦大学金史密斯学院计算机专业,伦敦大学金史密斯学院 Goldsmiths, University of London...
- springboot 系列技术教程目录
- 计算机语言中字体的设置,font-style字体设置详解
- 宝宝头三年影响一生[转]
- java网络通信:伪异步I/O编程(PIO)
- Linux与windows的软/硬链接
- [转载] python3.5 利用openpyxl模块来处理excel表
- js 控制鼠标_原生js实现改变视频播放速率
- Network In Network论文笔记
- Java调用ffmepg+mencoder视频格式转换(*)
- android sms 接收短信,Android SMS 短信操作
- HDOJ 1847Good Luck in CET-4 Everybody!(巴士博弈)
- 修改android默认锁屏方式
- python求素数平均值_用python怎么求素数
- YYDS!使用 Python 全面分析股票数据特征
- 查询彩票中奖号码小程序
- 商业模式-创新-增值价值