一道奇奇怪怪的数据结构题?

把树线性化,然后分块维护吧。

为了加速,求和用树状数组维护每个块的值。

#include<bits/stdc++.h>
#define N 100010
#define M 320
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
struct Edge{int u,v,next;}G[N*];
ll c[N],ans[N],val[N];
int cnt,tot,head[N],block,rt,tpos[N],pos[N],size[N],num,n,m;
int lx[M],rx[M],f[M][N];
void addedge(int u,int v){
G[++tot].u=u;G[tot].v=v;G[tot].next=head[u];head[u]=tot;
G[++tot].u=v;G[tot].v=u;G[tot].next=head[v];head[v]=tot;
}
inline int lowbit(int x){return (x&(-x));}
inline void add(int x,ll v){for(int i=x;i<=n;i+=lowbit(i))c[i]+=v;}
inline ll ask(int x){
ll ans=;
for(int i=x;i;i-=lowbit(i))ans+=c[i];
return ans;
}
void dfs(int u,int fa){
for(int i=;i<=num;i++)f[i][u]=f[i][fa];f[pos[u]][u]++;
tpos[u]=++cnt;size[u]=;
add(tpos[u],val[u]);
for(int i=head[u];i;i=G[i].next){
int v=G[i].v;if(v==fa)continue;
dfs(v,u);
size[u]+=size[v];
}
}
void change(int x,ll v){
add(tpos[x],v-val[x]);
for(int i=;i<=num;i++)ans[i]+=(ll)f[i][x]*(v-val[x]);
val[x]=v;
}
ull query(int l,int r){
ull ret=;
for(int i=pos[l]+;i<=pos[r]-;i++)ret+=ans[i];
if(pos[l]==pos[r]){
for(int i=l;i<=r;i++)ret+=ask(tpos[i]+size[i]-)-ask(tpos[i]-);
return ret;
}
if(l==lx[pos[l]])ret+=ans[pos[l]];
else for(int i=l;i<=rx[pos[l]];i++)ret+=ask(tpos[i]+size[i]-)-ask(tpos[i]-);
if(r==rx[pos[r]])ret+=ans[pos[r]];
else for(int i=lx[pos[r]];i<=r;i++)ret+=ask(tpos[i]+size[i]-)-ask(tpos[i]-);
return ret;
}
inline int read(){
int f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
inline ll readll(){
ll f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
int main(){
n=read();m=read();
for(int i=;i<=n;i++)val[i]=readll();
for(int i=;i<=n;i++){
int u=read(),v=read();
if(!u)rt=v;
else addedge(u,v);
}
block=(int)sqrt(n);num=n%block==?n/block:n/block+;
for(int i=;i<=n;i++)pos[i]=(i-)/block+;
dfs(rt,);
for(int i=;i<=num;i++){
lx[i]=(i-)*block+;rx[i]=min(i*block,n);
for(int j=lx[i];j<=rx[i];j++)ans[i]+=ask(tpos[j]+size[j]-)-ask(tpos[j]-);
}
while(m--){
int opt=read(),x=read(),y=read();
if(opt==)change(x,(ll)y);
else printf("%llu\n",query(x,y));
}
return ;
}

【bzoj4765】普通计算姬的更多相关文章

  1. BZOJ4765: 普通计算姬

    BZOJ4765: 普通计算姬 题目描述 传送门 题目分析 求的和非常奇怪,不具有连续性,所有上树的数据结构全死了. 考虑分块,思考对于一段连续的询问区间可以直接询问整块,零散块可以在树上dfs序暴力 ...

  2. [BZOJ4765]普通计算姬(分块+树状数组)

    4765: 普通计算姬 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 1725  Solved: 376[Submit][Status][Discus ...

  3. 2018.06.30 BZOJ4765: 普通计算姬(dfs序+分块+树状数组)

    4765: 普通计算姬 Time Limit: 30 Sec Memory Limit: 256 MB Description "奋战三星期,造台计算机".小G响应号召,花了三小时 ...

  4. [bzoj4765]普通计算姬(分块+树状数组+DFS序)

    题意 给定一棵n个节点的带权树,节点编号为1到n,以root为根,设sum[p]表示以点p为根的这棵子树中所有节点的权值和.计算姬支持下列两种操作: 1 给定两个整数u,v,修改点u的权值为v. 2 ...

  5. BZOJ4765 普通计算姬(分块+树状数组)

    对节点按编号分块.设f[i][j]为修改j号点对第i块的影响,计算f[i][]时dfs一遍即可.记录每一整块的sum.修改时对每一块直接更新sum,同时用dfs序上的树状数组维护子树和.查询时累加整块 ...

  6. [bzoj4765]普通计算姬——分块

    Brief Description 给定一棵n个节点的带权树,节点编号为1到n,以root为根,设sum[p]表示以点p为根的这棵子树中所有节点的权 值和.支持下列两种操作: 1 给定两个整数u,v, ...

  7. bzoj4765: 普通计算姬 (分块 && BIT)

    最近一直在刷分块啊 似乎感觉分块和BIT是超级棒的搭档啊 这道题首先用dfs预处理一下 得到每一个sum值 此时查询是O(1)的  (前缀和乱搞什么的 但是修改需要O(n) (需要修改该节点所有祖先的 ...

  8. bzoj4766 文艺计算姬

    Description "奋战三星期,造台计算机".小W响应号召,花了三星期造了台文艺计算姬.文艺计算姬比普通计算机有更多的艺术细胞.普通计算机能计算一个带标号完全图的生成树个数, ...

  9. bzoj 4765: 普通计算姬

    Description "奋战三星期,造台计算机".小G响应号召,花了三小时造了台普通计算姬.普通计算姬比普通计算机要厉害一些 .普通计算机能计算数列区间和,而普通计算姬能计算树中 ...

  10. BZOJ_4765_普通计算姬_分块+dfs序+树状数组

    BZOJ_4765_普通计算姬_分块 Description "奋战三星期,造台计算机".小G响应号召,花了三小时造了台普通计算姬.普通计算姬比普通计算机要厉害一些 .普通计算机能 ...

随机推荐

  1. BZOJ4813 CQOI2017小Q的棋盘(树形dp)

    设f[i][j]为由i号点开始在子树内走j步最多能经过多少格点,g[i][j]为由i号点开始在子树内走j步且回到i最多能经过多少格点,转移显然. #include<iostream> #i ...

  2. 2018牛客多校第六场 G.Pikachu

    题意: 给出一棵n个点的树,每条边有边权.对这个树加边变成一个完全图.新加的边的权值为边上两点在树上的距离.求完全图上任意两点的最大流之和. 题解: 一共有C(n,2)个点对.假设当前求s到t之间的最 ...

  3. POJ2689:Prime Distance——题解

    http://poj.org/problem?id=2689 题目大意,给不超过int的l,r,其中r-l+1<=1000000,筛出其中的素数,并且求出相邻素数差值最大和最小的一对. ———— ...

  4. 虚拟机网络连接模式中桥接模式和NAT模式的区别

    1.桥接模式:当虚拟机系统的网络连接模式为桥接模式时,相当于在主机系统和虚拟机系统之间连接了一个网桥,而网桥两端的网络都属于同一网络,主机和虚拟机是处于同一网络中的对等主机. 实例,在使用Xshell ...

  5. HDOJ(HDU).1114 Piggy-Bank (DP 完全背包)

    HDOJ(HDU).1114 Piggy-Bank (DP 完全背包) 题意分析 裸的完全背包 代码总览 #include <iostream> #include <cstdio&g ...

  6. 四连测Day3

    题目链接:https://pan.baidu.com/s/1_vsHfMI_qO-9IDxmFLkHfg 密码: uza8 T1: 小奥的一笔画,判连通性,查奇偶点即可 #include<ios ...

  7. (ex)BSGS题表

    学了一下BSGS大概知道他是什么了,但是并没有做什么难题,所以也就会个板子.普通的BSGS,我还是比较理解的,然而exBSGS我却只理解个大概,也许还会个板子......(这个东西好像都会有一群恶心的 ...

  8. 在eclipse中安装html编辑器插件

    1.下载插件( 点击下载)                 解压后得到GEF-ALL-3.4.1.zip和tk.eclipse.plugin.htmleditor_2.2.0.jar   2.安装GE ...

  9. HDU 4417 主席树写法

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  10. Codeforces Round #398 (Div. 2) A B C D 模拟 细节 dfs 贪心

    A. Snacktower time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...