BZOJ 4765: 普通计算姬 (分块+树状数组)
解题思路
树上的分块题,,对于修改操作,每次修改只会对他父亲到根这条链上的元素有影响;对于查询操作,每次查询[l,r]内所有元素的子树,所以就考虑dfn序,进标记一次,出标记一次,然后子树就是进与出之间的所有元素。分块后预处理出每个点修改对当前块多少个元素的影响f[i][j],再预处理出每个块的和,然后修改时利用f数组暴力扫一遍所有块,查询是大块直接查sum,小块用树状数组查。要开unsigned long long
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath> using namespace std;
const int MAXN = ;
const int SIZE = ;
typedef unsigned long long ULL; inline int rd(){
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {f=ch=='-'?:;ch=getchar();}
while(isdigit(ch)) {x=(x<<)+(x<<)+ch-'';ch=getchar();}
return f?x:-x;
} int n,m,val[MAXN],f[MAXN][SIZE],bl[MAXN],l[SIZE],r[SIZE],siz,num,rt;
int head[MAXN],cnt,to[MAXN<<],nxt[MAXN<<],in[MAXN],out[MAXN],pos[MAXN];
int dfn;
ULL sum[MAXN],Sum[SIZE],ans,t[MAXN]; inline void add(int bg,int ed){
to[++cnt]=ed,nxt[cnt]=head[bg],head[bg]=cnt;
} void update(int x,int y){
for(;x<=n;x+=x&-x) t[x]+=y;
} ULL query(int x){
ULL ret=;
for(;x;x-=x&-x) ret+=t[x];
return ret;
} ULL Query(int x,int y){
ULL ret=;
if(bl[x]==bl[y]) {
for(register int i=x;i<=y;i++) ret+=query(out[i])-query(in[i]-);
return ret;
}
for(register int i=x;i<=r[bl[x]];i++) ret+=query(out[i])-query(in[i]-);
for(register int i=l[bl[y]];i<=y;i++) ret+=query(out[i])-query(in[i]-);
for(register int i=bl[x]+;i<bl[y];i++) ret+=Sum[i];
return ret;
} void dfs(int x,int fa){
in[x]=++dfn;pos[bl[x]]++;sum[x]=val[x];update(in[x],val[x]);
for(register int i=;i<=num;i++) f[x][i]=pos[i];
for(register int i=head[x];i;i=nxt[i]){
int u=to[i];if(u==fa) continue;
dfs(u,x);sum[x]+=sum[u];
}
out[x]=dfn;pos[bl[x]]--;Sum[bl[x]]+=sum[x];
} int main(){
n=rd(),m=rd();int op,x,y;
siz=sqrt(n)+;num=n/siz;if(n%siz) num++;
for(int i=;i<=n;i++) val[i]=rd(),bl[i]=(i-)/siz+;
for(int i=;i<=num;i++) l[i]=(i-)*siz+,r[i]=i*siz;
r[num]=n;
for(int i=;i<=n;i++){
x=rd(),y=rd();
if(x== || y==) rt=(x|y);
else add(x,y),add(y,x);
}
dfs(rt,);
while(m--){
op=rd(),x=rd(),y=rd();
if(op==){
int now=y-val[x];
for(register int i=;i<=num;i++)
Sum[i]+=(ULL)f[x][i]*now;
update(in[x],y-val[x]);val[x]=y;
}
else printf("%llu\n",Query(x,y));
}
return ;
}
BZOJ 4765: 普通计算姬 (分块+树状数组)的更多相关文章
- BZOJ 4765: 普通计算姬 [分块 树状数组 DFS序]
传送门 题意: 一棵树,支持单点修改和询问以$[l,r]$为根的子树的权值和的和 只有我这种不会分块的沙茶不会做这道题吗? 说一点总结: 子树和当然上$dfs$序了,询问原序列一段区间所有子树和,对原 ...
- bzoj 4765 普通计算姬(树状数组 + 分块)
http://www.lydsy.com/JudgeOnline/problem.php?id=4765 很nice的一道题啊(可能是因为卡了n久终于做出来了 题意就是给你一棵带点权的有根树,sum( ...
- [BZOJ4765]普通计算姬(分块+树状数组)
4765: 普通计算姬 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 1725 Solved: 376[Submit][Status][Discus ...
- BZOJ 4765 普通计算姬 (分块 + BIT)
4765: 普通计算姬 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 1547 Solved: 329[Submit][Status][Discus ...
- bzoj 4765: 普通计算姬 主席树+替罪羊树思想
题目大意: 给定一棵\(n\)个节点的带权树有根树,设\(sum_p\)表示以点\(p\)为根的这棵子树中所有节点的权 计算姬支持下列两种操作: 给定两个整数\(u,v\),修改点\(u\)的权值为\ ...
- 【BZOJ 3295】动态逆序对 - 分块+树状数组
题目描述 给定一个1~n的序列,然后m次删除元素,每次删除之前询问逆序对的个数. 分析:分块+树状数组 (PS:本题的CDQ分治解法见下一篇) 首先将序列分成T块,每一块开一个树状数组,并且先把最初的 ...
- 【bzoj2141】排队 分块+树状数组
题目描述 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家乐和和.红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们的身高有所区别, ...
- 【分块+树状数组】codechef November Challenge 2014 .Chef and Churu
https://www.codechef.com/problems/FNCS [题意] [思路] 把n个函数分成√n块,预处理出每块中各个点(n个)被块中函数(√n个)覆盖的次数 查询时求前缀和,对于 ...
- 【bzoj3744】Gty的妹子序列 分块+树状数组+主席树
题目描述 我早已习惯你不在身边, 人间四月天 寂寞断了弦. 回望身后蓝天, 跟再见说再见…… 某天,蒟蒻Autumn发现了从 Gty的妹子树(bzoj3720) 上掉落下来了许多妹子,他发现 她们排成 ...
随机推荐
- 剑指offer——15剪绳子
题目描述 给你一根长度为n的绳子,请把绳子剪成m段(m.n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],...,k[m].请问k[0]xk[1]x...xk[m]可能 ...
- Redis事务,持久化,哨兵机制
1 Redis事务 基本事务指令 Redis提供了一定的事务支持,可以保证一组操作原子执行不被打断,但是如果执行中出现错误,事务不能回滚,Redis未提供回滚支持. multi 开启事务 exec 执 ...
- Merge k Sorted Arrays【合并k个有序数组】【优先队列】
Given k sorted integer arrays, merge them into one sorted array. Example Given 3 sorted arrays: [ [1 ...
- Winform 获取桌面设备上下文
//获得桌面设备上下文 us(Graphics g = Graphics.FromHwnd(IntPtr.Zero)) { g.DrawLine(Pens.Red, , , , ); }
- List<VO>转成List<Map>
List<A01090021BatchAddCheckVO> list = (ArrayList<A01090021BatchAddCheckVO>) result.get(& ...
- VS环境下,DEV插件的ComboBoxEdit控件最简单的数据源绑定和获取方法
使用 ComboBoxEdit 控件绑定key/value值: 因为 ComboBoxEdit 没有 DataSource 属性,所以不能直接绑定数据源,只能一项一项的添加. 首先创建一个类ListI ...
- K8S之集群搭建
转自声明 ASP.NET Core on K8S深入学习(1)K8S基础知识与集群搭建 1.K8S环境搭建的几种方式 搭建K8S环境有几种常见的方式如下: (1)Minikube Minikube是一 ...
- css---盒模型新增样式
box-shadow 以逗号分割列表来描述一个或多个阴影效果,可以用到几乎任何元素上. 如果元素同时设置了 border-radius ,阴影也会有圆角效果.多个阴影时和多个 text shadows ...
- 【JZOJ4905】【BZOJ4720】【luoguP1850】换教室
description 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程.在可以选择的课程中,有2n节课程安排在n个时间段上.在第i(1≤i≤n)个时间段上,两节内容相同的课 ...
- 暑假集训test-8-26
真 noip模拟题 但是被我做得稀巴烂 新高二除了林巨做得勉强能看,其他人都做得稀巴烂 老张都要绝望了 t1.水呀水 题如其名是道水题.新建个点代表水源,跑最小生成树即可. //Achen #incl ...