[BZOJ]4034: [HAOI2015]树上操作
[HAOI2015]树上操作
题目大意:三个操作 1:a,b,c b节点权值+c 2:a,b,c 以b为根的子树节点权值全部+c 3:a,b 查询b到根路径的权值和。
题解:树链剖分
操作1 ,2是区间修改,3是区间和。
看题解都提示开long long 了,我也开了,可是整形相乘赋值给Long long时爆了。
简直要哭晕了。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 500005
#define LL long long
using namespace std; int sumedge,cnt,n,m;
int head[maxn],size[maxn],dad[maxn],deep[maxn],top[maxn];
int tpos[maxn],re[maxn],w[maxn]; struct Tree{
int l,r;LL sum,s;
}tr[maxn<<]; struct Edge{
int x,y,nxt;
Edge(int x=,int y=,int nxt=):
x(x),y(y),nxt(nxt){}
}edge[maxn<<]; void read(int &x){
char ch=getchar();x=;int f=;
for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';
x=x*f;
} void add(int x,int y){
edge[++sumedge]=Edge(x,y,head[x]);
head[x]=sumedge;
} void dfs(int x){
size[x]=;deep[x]=deep[dad[x]]+;
for(int i=head[x];i;i=edge[i].nxt){
int v=edge[i].y;
if(v==dad[x])continue;
dad[v]=x;dfs(v);
size[x]+=size[v];
}
} void dfs_(int x){
int s=;tpos[x]=++cnt;re[cnt]=x;
if(!top[x])top[x]=x;
for(int i=head[x];i;i=edge[i].nxt){
int v=edge[i].y;
if(v!=dad[x]&&size[v]>size[s])s=v;
}
if(s){
top[s]=top[x];
dfs_(s);
}
for(int i=head[x];i;i=edge[i].nxt){
int v=edge[i].y;
if(v!=dad[x]&&v!=s)dfs_(v);
}
} void pushup(int rt){
tr[rt].sum=tr[rt<<].sum+tr[rt<<|].sum;
return;
} void pushdown(int rt){
if(!tr[rt].s)return;
tr[rt<<].s+=tr[rt].s;tr[rt<<|].s+=tr[rt].s;
tr[rt<<].sum+=(LL)(tr[rt<<].r-tr[rt<<].l+)*tr[rt].s;
tr[rt<<|].sum+=(LL)(tr[rt<<|].r-tr[rt<<|].l+)*tr[rt].s;
tr[rt].s=;return;
} void build(int rt,int l,int r){
tr[rt].l=l;tr[rt].r=r;
if(l==r){
tr[rt].sum=w[re[l]];
return;
}
int mid=(l+r)>>;
build(rt<<,l,mid);build(rt<<|,mid+,r);
pushup(rt);
} void change(int rt,int l,int r,int ql,int qr,int p){
if(l>=ql&&r<=qr){
tr[rt].sum+=(LL)(r-l+)*p;
tr[rt].s+=p;
return;
}
pushdown(rt);
int mid=(l+r)>>;
if(ql<=mid)change(rt<<,l,mid,ql,qr,p);
if(qr>mid)change(rt<<|,mid+,r,ql,qr,p);
pushup(rt);
} LL query_sum(int rt,int l,int r,int ql,int qr){
if(l>=ql&&r<=qr){
return tr[rt].sum;
}
pushdown(rt);
int mid=(l+r)>>;LL ans=;
if(ql<=mid)ans+=query_sum(rt<<,l,mid,ql,qr);
if(qr>mid)ans+=query_sum(rt<<|,mid+,r,ql,qr);
return ans;
} LL query(int x){
LL ret=;
for(;top[x]!=;){
ret+=query_sum(,,n,tpos[top[x]],tpos[x]);
x=dad[top[x]];
}
ret+=query_sum(,,n,,tpos[x]);
return ret;
} int main(){
read(n);read(m);
for(int i=;i<=n;i++)read(w[i]);
for(int i=;i<n;i++){
int x,y;
read(x);read(y);
add(x,y);add(y,x);
}
dfs();dfs_();build(,,n);
for(int i=;i<=m;i++){
int od,x,a;
read(od);read(x);
if(od==){
read(a);
change(,,n,tpos[x],tpos[x],a);
}else if(od==){
read(a);
change(,,n,tpos[x],tpos[x]+size[x]-,a);
}else if(od==){
printf("%lld\n",query(x));
}
}
return ;
}
AC
[BZOJ]4034: [HAOI2015]树上操作的更多相关文章
- BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 )
BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 ) 题意分析 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 ...
- bzoj 4034: [HAOI2015]树上操作 树链剖分+线段树
4034: [HAOI2015]树上操作 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 4352 Solved: 1387[Submit][Stat ...
- bzoj 4034: [HAOI2015]树上操作 (树剖+线段树 子树操作)
4034: [HAOI2015]树上操作 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 6779 Solved: 2275[Submit][Stat ...
- bzoj 4034 [HAOI2015]树上操作 入栈出栈序+线段树 / 树剖 维护到根距离和
题目大意 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有点的点权都 ...
- BZOJ 4034 [HAOI2015]树上操作(欧拉序+线段树)
题意: 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有点的点权都增 ...
- BZOJ 4034: [HAOI2015]树上操作 [欧拉序列 线段树]
题意: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 a . 操作 3 :询问某个节点 x 到根的路径中所有点的点权和. 显然树链剖分可做 ...
- bzoj 4034: [HAOI2015]树上操作——树链剖分
Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中 ...
- BZOJ 4034[HAOI2015]树上操作(树链剖分)
Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种:操作 1 :把某个节点 x 的点权增加 a .操作 2 :把某个节点 x 为根的子树中所有点 ...
- 洛谷 P3178 BZOJ 4034 [HAOI2015]树上操作
题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种:操作 1 :把某个节点 x 的点权增加 a .操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 ...
随机推荐
- Maven:如何在eclipse里新建一个Maven的java项目和web项目
如何在eclipse里新建一个Maven的java项目和web项目: 一:java项目 New-->Other-->Maven 右击项目-->properties,修改以下文件: ① ...
- [POI2001]和平委员会
题目描述 根据宪法,Byteland民主共和国的公众和平委员会应该在国会中通过立法程序来创立. 不幸的是,由于某些党派代表之间的不和睦而使得这件事存在障碍. 此委员会必须满足下列条件: 每个党派都在委 ...
- Java Lambda表达
Java 8 lambda表达式示例 我个人对Java 8发布非常激动,尤其是lambda表达式和流API.越来越多的了解它们,我能写出更干净的代码.虽然一开始并不是这样.第一次看到用lambda表达 ...
- python 低版本一段扫描代码
个人在做Linux渗透测试往内网跨的时候,通常我碰到的Linux环境都会是如下集中情况 1: DMZ,严格的DMZ,根本跨不到内网里去.这种最恶心了. 2:WEB SERVER,严格区分,工作机和工作 ...
- Flume-NG源码阅读之SinkGroups和SinkRunner
在AbstractConfigurationProvider类中loadSinks方法会调用loadSinkGroups方法将所有的sink和sinkgroup放到了Map<String, Si ...
- ceph存储 ceph Bluestore的架构
ceph 目前是开源社区比较流行的分布式块存储系统,其以良好的架构,稳定性和完善的数据服务功能,获得的了广泛的部署和应用. 目前ceph 最大的问题是其性能相对较差,特别是无法发挥SSD等高速设备的硬 ...
- Spring简洁版总结
一:为什么使用spring? spring泉眼,最好的水,在企业开发中,是业务层最好的框架 spring优点是什么? 1.低侵入,低耦合 2.方便集成其他框架 3.降低javaee开发难度 4.spr ...
- Spark- 使用第三方依赖解析IP地址
使用 github上已有的开源项目1)git clone https://github.com/wzhe06/ipdatabase.git 2)编译下载的项目: mvn clean package- ...
- BZOJ 3931 [CQOI2015]网络吞吐量:最大流【拆点】
传送门 题意 给你一个 $ n $ 个点,$ m $ 条边的无向网络,每条边有长度.每个点的流量限制为 $ c[i] $ . 要求流量只能经过从 $ 1 $ 的 $ n $ 的最短路.问你最大流是多少 ...
- mysql数据库优化课程---12、mysql嵌套和链接查询
mysql数据库优化课程---12.mysql嵌套和链接查询 一.总结 一句话总结:查询user表中存在的所有班级的信息? in distinct mysql> select * from cl ...