题面:

  给一颗以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. qt中线程的使用方法

    QT中使用线程可以提高工作效率. 要使用线程要经过一下四个步骤: (1)先创建一个c++ class文件,记得继承Thread,创建步骤如下: a.第一步 b.第二步 (2)自定义一个run函数,以后 ...

  2. 三十天学不会TCP,UDP/IP网络编程-TraceRoute的哲学

    新年快乐,继续来部分粘贴复制我的这一系列文章啦,如果对和程序员有关的计算机网络知识,和对计算机网络方面的编程有兴趣,欢迎去gitbook(https://www.gitbook.com/@rogerz ...

  3. SQL Server授权购买简单介绍

    SQL Server授权购买简单介绍 之前有同事问我,使用盗版序列号的SQL Server到底有没有性能限制,之前本人一直没有深入研究过,后来经过一番资料搜集和查证,汇总成这篇文章 微软的SQL Se ...

  4. 图片放大功能如何做?jquery实现

    花了很长时间撸了个网站,观点,其中需要一个图片放大功能,网上找了半天发现都没有中意的,最后无奈之下自己写了一个,演示地址,演示图片: 自我感觉效果还不错,现在分享开来给大家看看,哪里不好还请多多指教, ...

  5. JavaScript的DOM编程--11--插入节点

    插入节点: 1). insertBefore(): 把一个给定节点插入到一个给定元素节点的给定子节点的前面 var reference = element.insertBefore(newNode,t ...

  6. PXE+kickstart网络安装CentOS7.4系统及过程中各种报错

    环境:关闭防火墙.selinux 注意:虚拟机进行网络安装的话,7.3以后的系统是需要2G以上的内存 [root@kickstart ~]# cat /etc/redhat-release CentO ...

  7. 基于web的网上书城系统开发-----登录注册扩展-------验证码功能

    public class CheckCode extends HttpServlet { private static final long serialVersionUID = 1L; privat ...

  8. 北斗时钟同步系统-GPS卫星授时设备-NTP网络校时服务器

    北斗时钟同步系统-GPS卫星授时设备-NTP网络校时服务器 北斗时钟同步系统-GPS卫星授时设备-NTP网络校时服务器 北斗时钟同步系统-GPS卫星授时设备-NTP网络校时服务器 论述当下网络时间同步 ...

  9. iOS项目开发常用功能静态库

    YHDeveloperTools iOS项目开发常用功能静态库 查看源码 功能方法: 1.字符检查 [NSString checkStringWithType:Email andTargetStrin ...

  10. Nginx配置反向代理

    Nginx可做web服务器,也可做负载均衡使用. 反向代理:应用服务器不直接提供服务,通过nginx服务器处理请求, 转发到代理服务器(Tomcat,Nginx,Apache等) 获取响应交给客户端, ...