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. Tarjan算法:求解无向连通图图的割点(关节点)与桥(割边)

    1. 割点与连通度 在无向连通图中,删除一个顶点v及其相连的边后,原图从一个连通分量变成了两个或多个连通分量,则称顶点v为割点,同时也称关节点(Articulation Point).一个没有关节点的 ...

  2. FastReport 使用入门

    FastReport  是微软开发的一款快速报表工具,使用起来非常方便简单  最关键的是快捷. 下面介绍一下 Fastreport在项目中的使用. 下图为其中一个效果图 首先 打开FastReport ...

  3. Mac环境下 Python3安装及配置

    1.mac 环境下安装 python3 .查看 mac 自带系统版本 #查看系统自带的python open /System/Library/Frameworks/Python.framework/V ...

  4. 如何编译(helloworld)可以在开发板上运行的应用

    本节介绍如何编译可以在开发板上运行的应用,编译方法很简单.基于:iTOP4412开发板首先要确定一下环境变量,如下图所示,使用“cd”命令回到根目录,然后使用命令“vim .bashrc”打开环境变量 ...

  5. 吴裕雄--天生自然python学习笔记:python 用pygame模块制作 MP3 音乐播放器

    利用 music 对象来制作一个 MP3 音乐播放器 . 应用程序总览 从歌曲清单中选择指定的歌曲,单击“播放”按钮可开始播放, 在播放 xxx 歌曲”的信息. 歌曲播放的过程中,可以暂停.停止,也可 ...

  6. flask 完成简单查询请求处理,及跨域

    文章大纲 flask通用项目结构 flask 简介 主体代码逻辑 flask 跨域问题的处理 flask 日志 flask 微服务Flask-RESTful 启动服务命令 flask通用项目结构 | ...

  7. Linux的基础知识

    什么是操作系统? 操作系统是人与计算机的中介. 操作系统是干什么的? 控制所有资源{硬件资源和软件资源(驱动,应用软件)} 常用的操作系统:Unix Windows Linux Linux的哲学思想: ...

  8. python爬虫和数据分析、数据挖掘

    一.python爬虫脑图: 二.python爬虫流程: 三.python数据分析简介 四.python数据预处理方法 五.python数据挖掘 六.数据探索基础

  9. 用C语言实现的轴对称变换

    #include<stdio.h> main() { int i,p,n,k,f,c,h,g,w; ][]; ;i<=;i++) { ;p<=;p++) { a[i][p]=i ...

  10. @EnableWebMvc WebMvcConfigurer CorsConfig

    package me.zhengjie.core.config; import org.springframework.context.annotation.Configuration; import ...