题意:

思路:分块

使用树状数组维护sum[i]的前缀和

使用主席树维护root到u的路径上点的编号出现的个数

每次操作如果是修改就加入队列

如果是询问,考虑块内操作对询问的影响,每次在x点加上y会使x到root的点sum都加上y

每根号n次操作就暴力重构一次,清空队列并求出新的sum[i]的前缀和

 var t:array[..]of record
l,r:longint;
s:int64;
end;
sum,bit:array[..]of int64;
stk:array[..,..]of longint;
head,vet,next,fa,a:array[..]of longint;
root:array[..]of longint;
n,m,x,y,i,j,top,tot,cnt,kuai,rt,op:longint;
ans,tmp:int64; procedure add(a,b:longint);
begin
inc(tot);
next[tot]:=head[a];
vet[tot]:=b;
head[a]:=tot;
end; procedure pushup(p:longint);
begin
t[p].s:=t[t[p].l].s+t[t[p].r].s;
end; procedure update(l,r,x:longint;var p:longint);
var mid:longint;
begin
inc(cnt); t[cnt]:=t[p];
p:=cnt; inc(t[p].s);
if l=r then exit;
mid:=(l+r)>>;
if x<=mid then update(l,mid,x,t[p].l)
else update(mid+,r,x,t[p].r);
pushup(p);
end; function query(l,r,x,y,p:longint):int64;
var mid:longint;
begin
if (l>=x)and(r<=y) then exit(t[p].s);
mid:=(l+r)>>;
query:=;
if x<=mid then query:=query+query(l,mid,x,y,t[p].l);
if y>mid then query:=query+query(mid+,r,x,y,t[p].r);
pushup(p);
end; procedure dfs1(u:longint);
var e,v:longint;
begin
root[u]:=root[fa[u]];
update(,n,u,root[u]);
e:=head[u];
while e<> do
begin
v:=vet[e];
if v<>fa[u] then
begin
fa[v]:=u;
dfs1(v);
end;
e:=next[e];
end;
end; procedure dfs2(u:longint);
var e,v:longint;
begin
sum[u]:=a[u];
e:=head[u];
while e<> do
begin
v:=vet[e];
if v<>fa[u] then
begin
dfs2(v);
sum[u]:=sum[u]+sum[v];
end;
e:=next[e];
end;
end; function lowbit(x:longint):longint;
begin
exit(x and (-x));
end; procedure addbit(x:longint;y:int64);
begin
while x<=n do
begin
bit[x]:=bit[x]+y;
x:=x+lowbit(x);
end;
end; function querybit(x,y:longint):int64;
var k:longint;
begin
k:=y;
querybit:=;
while k> do
begin
querybit:=querybit+bit[k];
k:=k-lowbit(k);
end;
k:=x-;
while k> do
begin
querybit:=querybit-bit[k];
k:=k-lowbit(k);
end;
end; procedure build;
var i:longint;
begin
for i:= to n do bit[i]:=;
for i:= to n do addbit(i,sum[i]);
end; begin
assign(input,'common.in'); reset(input);
assign(output,'common.out'); rewrite(output);
readln(n,m);
kuai:=;
for i:= to n do read(a[i]);
for i:= to n do
begin
readln(x,y);
if x= then rt:=y
else
begin
add(x,y);
add(y,x);
end;
end;
dfs1(rt);
fillchar(head,sizeof(head),);
tot:=;
for i:= to n do
if i<>rt then add(fa[i],i);
dfs2(rt);
build; for i:= to m do
begin
readln(op,x,y);
if op= then
begin
inc(top); stk[top,]:=x; stk[top,]:=y-a[x];
a[x]:=y;
end
else
begin
ans:=querybit(x,y);
for j:= to top do
begin
tmp:=query(,n,x,y,root[stk[j,]]);
ans:=ans+stk[j,]*tmp;
end;
writeln(ans);
end;
if i mod kuai= then
begin
top:=;
dfs2(rt);
build;
end;
end;
close(input);
close(output);
end.

【ZJOI2017 Round1练习&BZOJ4765】D1T3 普通计算姬(主席树,分块)的更多相关文章

  1. bzoj 4765: 普通计算姬 主席树+替罪羊树思想

    题目大意: 给定一棵\(n\)个节点的带权树有根树,设\(sum_p\)表示以点\(p\)为根的这棵子树中所有节点的权 计算姬支持下列两种操作: 给定两个整数\(u,v\),修改点\(u\)的权值为\ ...

  2. 【bzoj4765】普通计算姬(双重分块)

    题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4765 这道题已经攒了半年多了...因为懒,一直没去写...所以今天才把这道题写出来... ...

  3. BZOJ4766:文艺计算姬(矩阵树定理)

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

  4. bzoj 4765 普通计算姬 dfs序 + 分块

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

  5. [bzoj4766] 文艺计算姬 (矩阵树定理+二分图)

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

  6. 【bzoj4765】 普通计算姬

    题意 给出一棵有根树,$n$个点每个都有一个点权.$m$组操作每次可以修改一个点权或者询问编号在区间$[l,r]$的点的子树权值和的和. Solution 我们对节点编号分块,每一块统计该块中的节点的 ...

  7. 【bzoj4765】普通计算姬

    一道奇奇怪怪的数据结构题? 把树线性化,然后分块维护吧. 为了加速,求和用树状数组维护每个块的值. #include<bits/stdc++.h> #define N 100010 #de ...

  8. BZOJ 4765 普通计算姬 dfs序+分块+树状数组+好题!!!

    真是道好题...感到灵魂的升华... 按dfs序建树状数组,拿前缀和去求解散块: 按点的标号分块,分成一个个区间,记录区间子树和 的 总和... 具体地,需要记录每个点u修改后,对每一个块i的贡献,记 ...

  9. bzoj 4766: 文艺计算姬 矩阵树定理

    题目: 给定一个一边点数为\(n\),另一边点数为\(m\),共有\(n*m\)条边的带标号完全二分图\(K_{n,m}\) 计算其生成树个数 \(n,m,p \leq 10^{18} ,p为模数\) ...

随机推荐

  1. AJPFX总结java InputStream读取数据问题

    1. 关于InputStream.read()     在从数据流里读取数据时,为图简单,经常用InputStream.read()方法.这个方法是从流里每次只读取读取一个字节,效率会非常低.     ...

  2. AJPFX总结heap和stack有什么区别?

    栈是后进先出的线性表结构,存取速度比堆快.创建对象的时候new一个对象,引用存在栈上具体的内容存在堆上. 栈与堆都是Java用来在RAM中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不 ...

  3. Intent实现界面跳转、程序跳转

    一个程序往往由多个界面组成,界面之间的跳转,实质是Activity之间的跳转. 从当前程序跳转到其它程序,实质是启动了目标程序的入口Activity. Intent被称为意图,常用于组件之间的交互,可 ...

  4. ssl证书过期问题解决

    1,ssl证书失效现象 小程序debug有如下证书无效信息: 浏览器访问https://ic-park.net:30001/indoornav/callFunction1.php 提示证书风险. 2, ...

  5. UVA 11971 Polygon 多边形(连续概率)

    题意: 一根长度为n的木条,随机选k个位置将其切成k+1段,问这k+1段能组成k+1条边的多边形的概率? 思路: 数学题.要求的是概率,明显与n无关. 将木条围成一个圆后再开切k+1刀,得到k+1段. ...

  6. codevs 1316 文化之旅 2012年NOIP全国联赛普及组

    时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文 ...

  7. Hessian矩阵与牛顿法

    Hessian矩阵与牛顿法 牛顿法 主要有两方面的应用: 1. 求方程的根: 2. 求解最优化方法: 一. 为什么要用牛顿法求方程的根? 问题很多,牛顿法 是什么?目前还没有讲清楚,没关系,先直观理解 ...

  8. Netbeans Makefile: recipe for target 'XXX' failed 运行failed(退出值 -1073741511 找不到C/C++库文件,关键字

      今天不知怎么的又出错了 吐血了 找不到NULL new等关键字了   看到知乎上有人和我一个问题,怎么办?很简单卸载了以前的cygwin和netbeans然后重装,我重装时没有把以前的cygwin ...

  9. django模板系统的基本原则

    写模板,创建template对象,创建 context ,调用render()方法

  10. SpringBoot自定义一个starter

    @Configuration //指定这个类是一个配置类 @ConditionalOnXXX //在指定条件成立的情况下自动配置类生效 @AutoConfigureAfter //指定自动配置类的顺序 ...