Source and Judge

51nod1462

Analysis

请先思考后再展开

dffxtz师兄出的题

做法一:
暴力树剖+分块,时间复杂度为 $O(nlognsqrt n)$

做法二:
利用矩阵乘法的优秀性质,树剖
时间复杂度为 $O(8nlog^2 n)$

做法三:
考虑时间倒流,考虑每次操作1的增量的总系数,就是后面有多少次操作2
不太好整体做,不妨考虑树上启发式合并,树状数组边插边弄
时间复杂度为 $O(nlog^2 n)$

做法四:
把树上启发式改为线段树合并,开两棵以时间为下标的动态开点线段树
统计答案就是类似cdq的过程,而复杂度则和合并是一样的
时间复杂度为 $O(nlogn)$

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include<ctime>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<map>
#include<set>
#include<queue>
#include<deque>
#include<stack>
#include<bitset>
#include<vector>
#include<algorithm>
#include<iostream>
#include<deque>
using namespace std;
namespace mine
{
typedef long long ll;
const int INF=0x3f3f3f3f;
ll ()
{
ll ans=0;char c=getchar();int f=1;
while(c<'0' or c>'9') {if(c=='-') f=-1;c=getchar();}
while('0'<=c and c<='9') ans=ans*10+c-'0',c=getchar();
return ans*f;
}
void write(int num)
{
if(num<0) {num=-num;putchar('-');}
if(num>9) write(num/10);
putchar('0'+num%10);
}
void writeln(int num){write(num);puts(大专栏  【51nod1462】树据结构span class="string">"");}
#define pr pair<int,int>
#define FR first
#define SE second
#define MP make_pair
inline void chmin(ll &x,ll y) {x=x<y?x:y;}
const int MAX_N=110000;
vector<int> son[MAX_N];
int id=0;
void insert(ll s[],int lc[],int rc[],int &x,int l,int r,int p,ll c)
{
if(x==0) x=++id;
s[x]+=c;
if(l==r) return;
int mid=(l+r)>>1;
if(p<=mid) insert(s,lc,rc,lc[x],l,mid,p,c);
else insert(s,lc,rc,rc[x],mid+1,r,p,c);
}
void merg(ll s[],int lc[],int rc[],int x,int &y,int l,int r)
{
if(x==0) return;
if(y==0) {y=x;return;}
s[y]+=s[x];
if(l==r) return;
int mid=(l+r)>>1;
merg(s,lc,rc,lc[x],lc[y],l,mid);
merg(s,lc,rc,rc[x],rc[y],mid+1,r);
}
ll s[2][MAX_N*20];
int rt[2][MAX_N],lc[2][MAX_N*20],rc[2][MAX_N*20];
ll ans[MAX_N];
void calc(ll &sum,int x,int y,int l,int r)
{
if(x==0 or y==0) return;
sum+=s[0][lc[0][x]]*s[1][rc[1][y]];
if(l==r) return;
int mid=(l+r)>>1;
calc(sum,lc[0][x],lc[1][y],l,mid);
calc(sum,rc[0][x],rc[1][y],mid+1,r);
}
int q;
void solve(int x)
{
calc(ans[x],rt[0][x],rt[1][x],1,q);
for(int t=0;t<(int)son[x].size();t++)
{
int y=son[x][t];
solve(y);
ans[x]+=ans[y];
calc(ans[x],rt[0][x],rt[1][y],1,q);
calc(ans[x],rt[0][y],rt[1][x],1,q);
merg(s[0],lc[0],rc[0],rt[0][y],rt[0][x],1,q);
merg(s[1],lc[1],rc[1],rt[1][y],rt[1][x],1,q);
}
}
void main()
{
int n;scanf("%d",&n);
for(int i=2;i<=n;i++) son[qread()].push_back(i);
scanf("%d",&q);
for(int i=1;i<=q;i++)
{
int op=qread(),x=qread();ll d=qread();
if(op==1) insert(s[0],lc[0],rc[0],rt[0][x],1,q,i,d);
else insert(s[1],lc[1],rc[1],rt[1][x],1,q,i,d);
}
memset(ans,0,sizeof ans);
solve(1);
for(int i=1;i<=n;i++) printf("%lldn",ans[i]);
}
};
int main()
{
srand(time(0));
mine::main();
}

【51nod1462】树据结构的更多相关文章

  1. 51nod-1462: 树据结构

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

  2. [51nod1462]树据结构

    题面: 给一颗以1为根的树. 每个点有两个权值:vi, ti,一开始全部是零. Q次操作: 读入o, u, d o = 1 对u到根上所有点的vi += d  o = 2 对u到根上所有点的ti += ...

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

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

  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. 论文翻译——Dynamic Pooling and Unfolding Recursive Autoencoders for Paraphrase Detection

    Dynamic Pooling and Unfolding Recursive Autoencoders for Paraphrase Detection 动态池和展开递归自动编码器的意译检测 论文地 ...

  2. tensorflow用法记录

    使用 embedding 变量 import tensorflow as tf import numpy as np sess = tf.InteractiveSession() M = list(' ...

  3. rabbitmq安装(linux)遇到 很多坑

    1.下载erlang官网地址 http://www.erlang.org/download 挑选合适的版本 然后 建议20.3运行命令 wget http://erlang.org/download/ ...

  4. 吴裕雄--天生自然python Google深度学习框架:Tensorflow实现迁移学习

    import glob import os.path import numpy as np import tensorflow as tf from tensorflow.python.platfor ...

  5. Angular(二)

    Angular开发者指南(二)概念概述   template(模板):带有附加标记的模板HTMLdirectives(指令):使用自定义属性和元素扩展HTMLmodel(模型):用户在视图中显示的数据 ...

  6. linux系统用户管理(一)

    Linux系统用户管理1.用户管理*****2.Linux用户命令****3.用户创建的原理***4.密码管理***5.组命令管理**6.身份切换*****7.sudo提升权限***** 我们现在所使 ...

  7. linux误删除恢复(未验证)

    extundelete 大家基本都知道,在linux上误删除了东西后果是很严重的,尤其是在服务器上误删除了东西,对于字符终端,想要实现恢复删除的数据更是难上加难,对于Linux误删除了重要的东西,虽然 ...

  8. 【flask】RestFul的基本鉴权

    编写API的基本鉴权 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Author : shenqiang from flask import Fla ...

  9. SpringMVC配置前端控制器的路径问题

    在使用SpringMVC时,都需要在web.xml中配置一个前端控制器DispatcherServlet 控制器是一个servlet,但这个路径配置就有很多种,之前都是以扩展名配置的路径,如*.do, ...

  10. golang kafka clinet 内存泄露问题处理

    go 内存泄露 新版本服务跑上一天内存占用20g,显然是内存泄露 内存泄露的问题难在定位 技术上的定位 主要靠 pprof 生成统计文件 之前写web项目 基于net/http/pprof 可以看到运 ...