bzoj 3786 星系探索 dfs+splay
【BZOJ3786】星系探索
Description
物理学家小C的研究正遇到某个瓶颈。
他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均有且仅有一个依赖星球。主星球没有依赖星球。
我们定义依赖关系如下:若星球a的依赖星球是b,则有星球a依赖星球b.此外,依赖关系具有传递性,即若星球a依赖星球b,星球b依赖星球c,则有星球a依赖星球c.
对于这个神秘的星系中,小C初步探究了它的性质,发现星球之间的依赖关系是无环的。并且从星球a出发只能直接到达它的依赖星球b.
每个星球i都有一个能量系数wi.小C想进行若干次实验,第i次实验,他将从飞船上向星球di发射一个初始能量为0的能量收集器,能量收集器会从星球di开始前往主星球,并收集沿途每个星球的部分能量,收集能量的多少等于这个星球的能量系数。
但是星系的构成并不是一成不变的,某些时刻,星系可能由于某些复杂的原因发生变化。
有些时刻,某个星球能量激发,将使得所有依赖于它的星球以及他自己的能量系数均增加一个定值。还有可能在某些时刻,某个星球的依赖星球会发生变化,但变化后依然满足依赖关系是无环的。
现在小C已经测定了时刻0时每个星球的能量系数,以及每个星球(除了主星球之外)的依赖星球。接下来的m个时刻,每个时刻都会发生一些事件。其中小C可能会进行若干次实验,对于他的每一次实验,请你告诉他这一次实验能量收集器的最终能量是多少。
Input
第一行一个整数n,表示星系的星球数。
接下来n-1行每行一个整数,分别表示星球2-n的依赖星球编号。
接下来一行n个整数,表示每个星球在时刻0时的初始能量系数wi.
接下来一行一个整数m,表示事件的总数。
事件分为以下三种类型。
(1)"Q di"表示小C要开始一次实验,收集器的初始位置在星球di.
(2)"C xi yi"表示星球xi的依赖星球变为了星球yi.
(3)"F pi qi"表示星球pi能量激发,常数为qi.
Output
对于每一个事件类型为Q的事件,输出一行一个整数,表示此次实验的收集器最终能量。
Sample Input
1
1
4 5 7
5
Q 2
F 1 3
Q 2
C 2 3
Q 2
Sample Output
15
25
HINT
n<=100000,m<=300000,1<di,xi<=n,wi,qi<=100000.保证操作合法。
题意:给出一棵树,要求有以下这些操作:
1.求出一个节点到根的点权和。
2.将一个节点的父亲改变。
3.将一个子树中的每一个节点都加上一个权值
题解:主要是操作2,不然树链剖分可以强艹过,所以splay+dfs序即可。
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<map>
#include<queue>
#include<vector>
#include<cstdlib>
#include<ctime> #define ll long long
#define N 200007
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch>''||ch<''){if (ch=='-') f=-;ch=getchar();}
while(ch<=''&&ch>=''){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
} int n,q;
int rt,top,tot;
int a[N],sta[N],fa[N],w[N],v[N],tag[N];
int c[N][],t[N][],s[N][];
int cnt,head[N],next[N],rea[N];
ll sum[N]; void add(int u,int v)
{
next[++cnt]=head[u];
head[u]=cnt;
rea[cnt]=v;
}
void dfs(int u)
{
v[t[u][]=++tot]=a[u],w[tot]=;
for (int i=head[u];i!=-;i=next[i])
{
int v=rea[i];
if (!t[v][])
dfs(v);
}
v[t[u][]=++tot]=-a[u],w[tot]=-;
}
inline void pushup(int p)
{
if (!p) return;
int l=c[p][],r=c[p][];
s[p][]=s[l][]+s[r][]+(w[p]==);
s[p][]=s[l][]+s[r][]+(w[p]==-);
sum[p]=sum[l]+sum[r]+v[p];
}
inline void update(int p,ll z)
{
if (!p) return;
sum[p]+=(ll)(s[p][]-s[p][])*z;
v[p]+=w[p]*z;
tag[p]+=z;
}
inline void pushdown(int x)
{
if (!x) return;
if (!tag[x]) return;
update(c[x][],tag[x]);
update(c[x][],tag[x]);
tag[x]=;
}
void rotate(int x,int &k)
{
int y=fa[x],z=fa[y],l,r;
if (c[y][]==x) l=;else l=;r=l^;
if (y!=k) c[z][c[z][]==y]=x;
else k=x;
fa[x]=z,fa[y]=x,fa[c[x][r]]=y;
c[y][l]=c[x][r],c[x][r]=y;
pushup(x),pushup(y);
}
void splay(int x,int &k)
{
// cout<<" "<<x<<" "<<k<<endl;
for(int i=x;i;i=fa[i]) sta[++top]=i;
while (top) pushdown(sta[top--]);
while(x!=k)
{
//cout<<x<<" "<<k<<endl;
int y=fa[x],z=fa[y];
if (y!=k)
{
if (c[z][]==y^c[y][]==x) rotate(x,k);
else rotate(y,k);
}
rotate(x,k);
}
}
inline int findmin(int x)
{
while(c[x][])
x=c[x][];
return x;
}
inline int findmax(int x)
{
while(c[x][])
x=c[x][];
return x;
}
void split(int x,int y)
{
splay(x,rt);
int t1=findmax(c[x][]);
splay(y,rt);
int t2=findmin(c[y][]);
splay(t1,rt);
splay(t2,c[t1][]);
}
void build(int l,int r,int f)
{
if (l>r) return;
int x=(l+r)>>;
fa[x]=f;c[f][x>f]=x;
if (l==r)
{
sum[x]=v[x];
s[x][]=w[x]==;
s[x][]=-s[x][];
return;
}
build(l,x-,x);build(x+,r,x);
pushup(x);
}
int main()
{
memset(head,-,sizeof(head));
n=read();
for (int i=;i<=n;i++)
{
int x=read();
add(x,i);
}
for (int i=;i<=n;i++)
a[i]=read();
tot=,dfs();//增加哨兵。
build(,*n+,);
rt=(+*n+)>>; q=read();
while(q--)
{
char ch[];
scanf("%s",ch);
if (ch[]=='Q')
{
int x=read();
splay(t[][],rt);
splay(t[x][],c[rt][]);
printf("%lld\n",sum[c[c[rt][]][]]+(ll)v[rt]+(ll)v[c[rt][]]);
}
else if (ch[]=='F')
{
int x=read(),y=read(),z;
splay(t[x][],rt);splay(t[x][],c[rt][]);
z=c[rt][];
v[rt]+=w[rt]*y;v[z]+=w[z]*y;
update(c[z][],y);
pushup(z);pushup(rt);
}
else
{
int x=read(),y=read(),z,tmp;
split(t[x][],t[x][]);
z=c[rt][];tmp=c[z][];c[z][]=;
pushup(z);pushup(rt);
splay(t[y][],rt);
splay(findmin(c[rt][]),c[rt][]);
z=c[rt][];c[z][]=tmp;fa[tmp]=z;
pushup(z);pushup(rt);
}
}
}
bzoj 3786 星系探索 dfs+splay的更多相关文章
- BZOJ 3786: 星系探索 解题报告
3786: 星系探索 Description 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均有且仅 ...
- BZOJ 3786 星系探索 (splay+dfs序)
题目大意:给你一棵树,支持一下三种操作 1.获取某节点到根节点的路径上所有节点的权值和 2.更换某棵子树的父亲 3.某子树内所有节点的权值都增加一个值w 当时想到了splay维护dfs序,查完题解发现 ...
- BZOJ 3786 星系探索 ——Splay
子树可以移动,唔. 还是用Splay维护DFS序即可. 子树的话直接截取出来就好了. 然后求前驱后继可能麻烦一些. 添加两个虚拟节点会比较好写. #include <map> #inclu ...
- BZOJ 3786 星系探索
Description 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均有且仅有一个依赖星球.主星球 ...
- BZOJ 3786: 星系探索 ETT
Description 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均有且仅有一个依赖星球.主星球 ...
- BZOJ 3786: 星系探索 [伪ETT]
传送门 数据,标程 题意: 一颗有根树,支持询问点到根路径权值和,子树加,换父亲 欧拉序列怎么求路径权值和? 一个点的权值只会给自己的子树中的点贡献,入栈权值正出栈权值负,求前缀和就行了! 和上题一样 ...
- BZOJ 3786: 星系探索 欧拉游览树
一个叫 Euler-Tour-Tree 的数据结构,说白了就是用 Splay_Tree 维护欧拉序 #include <cstring> #include <algorithm> ...
- BZOJ3786 星系探索 【Splay维护dfs序】*
BZOJ3786 星系探索 Description 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均 ...
- 【BZOJ3786】星系探索 DFS序+Splay
[BZOJ3786]星系探索 Description 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球 ...
随机推荐
- page.php 引入js文件
2种写法 <script type='text/javascript' src='<?php echo get_template_directory_uri().'/js/jquery-1 ...
- 《Redis开发与运维》快速笔记(一)
1.前言&基本介绍 在原始的系统架构中,我们都由程序直接连接DB,随着业务的进一步开展,DB的压力越来越大,为了缓解DB的这一压力,我们引入了缓存,在程序连接DB中加入缓存层, 从而减轻数据库 ...
- 外文翻译 《How we decide》多巴胺的预言 第三节
这是第二章的最后一节. 书的导言 本章第一节 本章第二节 本节阅读感言:自我批评是自我提升的妙方. 多巴胺是我们感情的源泉.多巴胺相关的神经系统在不断的记录着我们主观意识没有注意到的一个个模式,将它们 ...
- coursera网站中的VTT字幕的使用
coursera网站中的VTT字幕的使用 1.https://www.coursera.org/learn/os-virtsecurity/lecture/xuWgP/1-3-cao-zuo-xi-t ...
- UVA 1175 Ladies' Choice 女士的选择(稳定婚姻问题,GS算法)
题意: 给出每个男的心目中的女神排序,给出每个女的心目中的男神排序,即两个n*n的矩阵,一旦任意两个非舞伴的男女同学觉得对方都比现任舞伴要好,他们就会抛弃舞伴而在一起.为了杜绝这种现象,求每个男的最后 ...
- codevs 1422 河城荷取
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 在幻想乡,河城荷取是擅长高科技工业的河童.荷取的得意之作除了光学迷彩外,还有 ...
- 30行代码消费腾讯人工智能开放平台提供的自然语言处理API
腾讯人工智能AI开放平台上提供了很多免费的人工智能API,开发人员只需要一个QQ号就可以登录进去使用. 腾讯人工智能AI开放平台的地址:https://ai.qq.com/ 里面的好东西很多,以自然语 ...
- 原创:E325: ATTENTION vim超完整超给力的问题与解决方法
又到了老葵花哥哥开课的时间 这是给大家提供一个企业常见的错误 我相信大家生活还编程中会长期使用接触这个错误 这里我们经常用的两个选项 (E)dit any way 编辑原来的文件,忽略刚刚做的修改 ( ...
- Django的架构
简介 Django继承并简化了MVC架构.MVC中的Controller部分基本全由Django完成.View部分被分割成两部分,即:负责HTML渲染的模板和负责显示逻辑的视图.所以Django又被称 ...
- Maven项目框架源代码和文档的查看
方便maven项目的调试和源代码学习,可以通过添加maven插件的方式下载源代码和文件进行查看. mavan插件节点结构如下: <project xmlns="http://maven ...