题面:

  给一颗以1为根的树。
  每个点有两个权值:vi, ti,一开始全部是零。
 Q次操作:
  读入o, u, d
  o = 1 对u到根上所有点的vi += d 
  o = 2 对u到根上所有点的ti += vi * d
  最后,输出每个点的ti值(n, Q <= 100000)
  有50%的数据N,Q <= 10000

  注:所有数64位整数不会爆。
 
 
一开始以为是链剖板子题,结果发现两个标记没法共存(就是说要更新某个标记的话另一个标记得传下去)
由swm大爷的教导可得T_T,可以搞个3*3的矩阵当标记...
1,t_d,0
0,1  ,0
v,t  ,1
 
UPD:
  v表示区间内共同增加的v,t表示区间内共同增加的t,t_d表示区间内共同增加的操作2的d的总和。
  具体操作的时候怎么维护标记就算一下矩乘后的结果吧
 
操作1的话就是乘上
1,0,0
0,1,0
d,0,1
 
操作2的话就是乘上
1,d,0
0,1,0
0,0,1

UPD:所以实际上只要维护三个标记就好,不用写矩乘.....复杂度O(nlog^2n * 下传标记复杂度)

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#define ll long long
#define ui unsigned int
#define ull unsigned long long
const int maxn=,mxnode=maxn<<;
struct zs{int too,pre;}e[maxn];int tot,last[maxn];
struct mat{ll mp[][];}tag[mxnode],nul={,,,,,,,,};
int lc[mxnode],rc[mxnode],tt;
int dfn[maxn],tim,fa[maxn],bel[maxn],sz[maxn];
int i,j,k,n,m;
int L,R;mat TAG;
ll an[maxn]; int ra,fh;char rx;
inline int read(){
rx=getchar(),ra=,fh=;
while((rx<''||rx>'')&&rx!='-')rx=getchar();
if(rx=='-')fh=-,rx=getchar();
while(rx>=''&&rx<='')ra*=,ra+=rx-,rx=getchar();return ra*fh;
} mat operator *(mat a,mat b){
mat c;
int i,j,k;
for(i=;i<;i++)for(j=;j<;j++)for(k=c.mp[i][j]=;k<;k++)
c.mp[i][j]+=a.mp[i][k]*b.mp[k][j];
return c;
} inline void pushdown(int x){
if(!tag[x].mp[][]&&!tag[x].mp[][])return;
int l=lc[x],r=rc[x];
tag[l]=tag[l]*tag[x],tag[r]=tag[r]*tag[x],
tag[x]=nul;
}
void insert(int x,int a,int b){
if(L<=a&&R>=b){tag[x]=tag[x]*TAG;return;}
pushdown(x);
int mid=a+b>>;
if(L<=mid)insert(lc[x],a,mid);
if(R>mid)insert(rc[x],mid+,b);
}
void dfss(int x,int a,int b){
if(a==b){an[a]=tag[x].mp[][];return;}
pushdown(x);
int mid=a+b>>;
dfss(lc[x],a,mid),dfss(rc[x],mid+,b);
}
void build(int a,int b){
int x=++tt;tag[x]=nul;
if(a==b)return;
int mid=a+b>>;
lc[x]=tt+,build(a,mid),rc[x]=tt+,build(mid+,b);
} void dfs(int x){
sz[x]=;
for(int i=last[x];i;i=e[i].pre)
fa[e[i].too]=x,dfs(e[i].too),sz[x]+=sz[e[i].too];
}
void dfs2(int x,int chain){
int i,mx=;
bel[x]=chain,dfn[x]=++tim;
for(i=last[x];i;i=e[i].pre)if(sz[e[i].too]>sz[mx])mx=e[i].too;
if(!mx)return;
dfs2(mx,chain);
for(i=last[x];i;i=e[i].pre)if(e[i].too!=mx)dfs2(e[i].too,e[i].too);
}
void run(int x){
while(bel[x]!=bel[])
L=dfn[bel[x]],R=dfn[x],insert(,,n),
x=fa[bel[x]];
L=dfn[bel[]],R=dfn[x],insert(,,n);
} inline void ins(int a,int b){
e[++tot].too=b,e[tot].pre=last[a],last[a]=tot;
}
int main(){
n=read();
for(i=;i<=n;i++)ins(read(),i);
dfs(),dfs2(,);
build(,n);
int id,x,d;
for(m=read();m;m--){
id=read(),x=read(),d=read();TAG=nul;
if(id==)TAG.mp[][]=d;else TAG.mp[][]=d;
run(x);
}
dfss(,,n);
for(i=;i<=n;i++)printf("%lld\n",an[dfn[i]]);
}

还是第一次见这种题。。

[51nod1462]树据结构的更多相关文章

  1. 51nod-1462: 树据结构

    [传送门:51nod-1462] 简要题意: 给出一棵n个点的树,每个点有两个权值v,t 有Q个操作,有两种操作: 1.将x到根上的路径上的点的v值都加上d 2.将x到根上的路径上的点的t值都加上每个 ...

  2. 51nod1462 树据结构(树链剖分+线段树)

    这题好久之前就被学长安利了...一直没写珍藏在收藏夹一个不为人知的角落233 这题怎么做...我们来数形结合,横坐标为$t_i$被加的次数(可看作时间$t$),纵坐标为$v_i$,那么$t_i$实际上 ...

  3. 【51nod1462】树据结构

    Source and Judge 51nod1462 Analysis 请先思考后再展开 dffxtz师兄出的题 做法一:暴力树剖+分块,时间复杂度为 $O(nlognsqrt n)$ 做法二:利用矩 ...

  4. 树状结构Java模型、层级关系Java模型、上下级关系Java模型与html页面展示

    树状结构Java模型.层级关系Java模型.上下级关系Java模型与html页面展示 一.业务原型:公司的组织结构.传销关系网 二.数据库模型 很简单,创建 id 与 pid 关系即可.(pid:pa ...

  5. 分享使用NPOI导出Excel树状结构的数据,如部门用户菜单权限

    大家都知道使用NPOI导出Excel格式数据 很简单,网上一搜,到处都有示例代码. 因为工作的关系,经常会有处理各种数据库数据的场景,其中处理Excel 数据导出,以备客户人员确认数据,场景很常见. ...

  6. 由简入繁实现Jquery树状结构

    在项目中,我们经常会需要一些树状结构的样式来显示层级结构等,比如下图的样式,之前在学.net的时候可以直接拖个服务端控件过来直接使用非常方便.但是利用Jquery的一些插件,也是可以实现这些效果的,比 ...

  7. php实现树状结构无级分类

    php实现树状结构无级分类   ).",'树2-1-1-2')";mysql_query($sql);?>

  8. Android无限级树状结构

    通过对ListView简单的扩展.再封装,即可实现无限层级的树控件TreeView. package cn.asiontang.nleveltreelistview; import android.a ...

  9. dzzoffice的树型结构用户管理设计

    在DzzOffice1.1的开发中,针对用户使用群体重新设计了,机构.部门.用户管理应用. 传统OA,企业相关程序,一般是设置机构-设置部门-设置职位-添加用户这样的步骤.每个步骤分为不同的管理界面. ...

随机推荐

  1. 插值查找C++

    和上一篇折半查找很类似,只有四则运算不一样,思想类似. 只是在插值查找的过程中,考虑了查找键的值. #include <iostream> using namespace std; //需 ...

  2. PHP-无限级分类

    给定省市地区数组如下: $area = array(                   array('id'=>1,'name'=>'安徽','parent'=>'0'),     ...

  3. 理解new构造函数和apply以及call

    今天在看设计模式的时候,遇到一些挺低级的东西,搞不懂,顾查阅资料整理记录一番. 先了解一下new构造函数的过程: function func(){ console.log('do'); } var f ...

  4. docker 保存 加载(导入 导出镜像

    tensorflow 的docker镜像很大,pull一次由于墙经常失败.其实docker 可以将镜像导出再导入. 保存加载(tensorflow)镜像 1) 查看镜像 docker images 如 ...

  5. Python列表操作

    自带帮助文档: >>> help(list) Help on class list in module builtins: class list(object) | list() - ...

  6. CSS学习之首页简单布局

    作为一个PHPer,在前端方面javascript.jquery这些的日常工作还搞的定.可对于div+css这些东西可就头疼了,所以现在开始学习CSS 跟着燕十八的教程开始从最基础学起,首先练习一个简 ...

  7. SQL基础学习_01_数据库和表

    SQL语句及其种类 1. SQL语句分为三类:     DDL(Data Definition Language): CREATE.DROP.ALTER;     DML(Data Manipulat ...

  8. Head First设计模式之迭代器模式

    一.定义 提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示: 主要解决:不同的方式来遍历整个整合对象. 何时使用:遍历一个聚合对象. 如何解决:把在元素之间游走的责任交给迭代 ...

  9. selenium自动化测试打开新标签窗口

    做项目自动化测试时遇到这个问题:先打开一个页面需要在现有打开浏览器的基础上新开一个标签页输入网址, 在网上查了很多无果,后来发现了内嵌js代码,让js代码实现的方式.谁有其他方法的可以共享一下 方法如 ...

  10. [js高手之路] 跟GhostWu一起封装一个字符串工具库-扩展trim,trimLeft,trimRight方法(2)

    我们接着上一篇的继续,在上一篇我们完成了工具库的架构,本文扩展字符串去空格的方法, 一共有3个 1,trimLeft: 去除字符串左边的空格 2,trimRight: 去除字符串右边的空格 3,tri ...