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. JAVA8 函数式接口

    一.什么是函数式接口 1.只包含一个抽象方法的接口,称为函数式接口. 2.你可以通过Lambda表达式来创建该接口的对象.(若Lambda表达式抛出一个受检异常,那么该异常需要在目标接口的抽象方法上进 ...

  2. mysql引擎与物理文件

    SELECT VERSION();show GLOBAL VARIABLES like '%PARTITION%';-- 查看分区情况 show GLOBAL VARIABLES like '%dat ...

  3. jQuery方法及使用

    jQuery内容: 选择器 筛选器 样式操作 文本操作 属性操作 文档处理 事件 动画效果 插件 each.data.Ajax 剩余未写的有: 1.表单筛选器: :text :password :fi ...

  4. DNA methylation|Transcription factors|PTM|Chromosome conformation|表观遗传学测序技术

    生物医疗大数据-DNA element functions and identification Genetic vs epigenetic GENETICS  遗传学 DNA Code: 64 tr ...

  5. LeetCode No.100,101,102

    No.100 IsSameTree 相同的树 题目 给定两个二叉树,编写一个函数来检验它们是否相同. 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的. 示例 输入: 1 1 / \ ...

  6. 传输层TCP和UDP

    TCP协议        传输控制协议        TCP是面向连接.可靠的进程到进程通信的协议        TCP提供全双工工服务,即数据可在同一时间双向传输        三次握手:      ...

  7. Django学习之模型层

    模型层 查看orm内部sql语句的方法的方法 1.如果是queryset对象,那么可以点query直接查看该queryset的内部sql语句 2.在Django项目的配置文件中,配置一下参数即可实现所 ...

  8. TPO1-1 Groundwater

    If the pores are large,the water in them will exist as drops too heavy for surface tension to hold,a ...

  9. [LC] 221. Maximal Square

    Given a 2D binary matrix filled with 0's and 1's, find the largest square containing only 1's and re ...

  10. 《Java 面试问题 一 Spring 、SpringMVC 、Mybatis》

    自己理解SSM框架可能问到的面试问题 一.需要知道的SSM基础知识 1.什么是Spring? Spring 是一款轻量级的 IOC (依赖反转) 和  APO (面向切面) 容器框架.(个人理解: 就 ...