bzoj4034: [HAOI2015]T2
4034: [HAOI2015]T2
Time Limit: 10 Sec Memory Limit: 256 MB
Submit: 2684 Solved: 843
Description
有一棵点数为 N 的树,以点 1 为根,且树点有边权。然后有 M 个
Input
第一行包含两个整数 N, M 。表示点数和操作数。
Output
对于每个询问操作,输出该询问的答案。答案之间用换行隔开。
Sample Input
1 2 3 4 5
1 2
1 4
2 3
2 5
3 3
1 2 1
3 5
2 1 2
3 3
Sample Output
9
13
HINT
对于 100% 的数据, N,M<=100000 ,且所有输入数据的绝对值都不
Source
1554438
| ksq2013 | 4034 | Accepted | 15676 kb | 2760 ms | C++/Edit | 2537 B | 2016-07-18 19:59:13 |
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
typedef long long ll;
int n,q,first[100100],val[100100];
ll col[400100],sum[400100];
struct Edge{int u,v,nxt;Edge(){nxt=0;}}e[200100];
int cnt,sz[100100],id[100100],mx[100100],fa[100100],blg[100100];
void dfs1(int x)
{
sz[x]=1;
for(int i=first[x];i;i=e[i].nxt)
if(e[i].v!=fa[x]){
fa[e[i].v]=x;
dfs1(e[i].v);
sz[x]+=sz[e[i].v];
}
}
void dfs2(int x,int tp)
{
blg[x]=tp;
id[x]=mx[x]=++cnt;
int k=0;
for(int i=first[x];i;i=e[i].nxt)
if(e[i].v!=fa[x]&&sz[e[i].v]>sz[k])
k=e[i].v;
if(k){
dfs2(k,tp);
mx[x]=max(mx[x],mx[k]);
}
for(int i=first[x];i;i=e[i].nxt)
if(e[i].v!=fa[x]&&e[i].v!=k)
{dfs2(e[i].v,e[i].v);mx[x]=max(mx[x],mx[e[i].v]);}
}
inline void pushdown(int k,int m)
{
if(col[k]){
col[k<<1]+=col[k];
col[k<<1|1]+=col[k];
sum[k<<1]+=(m-(m>>1))*col[k];
sum[k<<1|1]+=(m>>1)*col[k];
col[k]=0;
}
}
void update(int s,int t,int k,int l,int r,ll p)
{
if(l<=s&&t<=r){
sum[k]+=p*(ll)(t-s+1);
col[k]+=p;
return;
}pushdown(k,t-s+1);
int m=(s+t)>>1;
if(l<=m)update(s,m,k<<1,l,r,p);
if(r>m)update(m+1,t,k<<1|1,l,r,p);
sum[k]=sum[k<<1]+sum[k<<1|1];
}
ll qsum(int s,int t,int k,int l,int r)
{
if(l<=s&&t<=r)return sum[k];
pushdown(k,t-s+1);
int m=(s+t)>>1;
ll res=0;
if(l<=m)res+=qsum(s,m,k<<1,l,r);
if(r>m)res+=qsum(m+1,t,k<<1|1,l,r);
return res;
}
ll solvesum(int x,int f)
{
ll res=0;
while(blg[x]!=blg[f]){
res+=qsum(1,n,1,id[blg[x]],id[x]);
x=fa[blg[x]];
}
res+=qsum(1,n,1,id[f],id[x]);
return res;
}
int main()
{
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)
scanf("%d",&val[i]);
for(int i=1;i<=n-1;i++){
scanf("%d%d",&e[i].u,&e[i].v);
e[i].nxt=first[e[i].u];
first[e[i].u]=i;
e[i+n-1].u=e[i].v;
e[i+n-1].v=e[i].u;
e[i+n-1].nxt=first[e[i].v];
first[e[i].v]=i+n-1;
}
dfs1(1);
dfs2(1,1);
for(int i=1;i<=n;i++)
update(1,n,1,id[i],id[i],val[i]);
for(int i=1;i<=q;i++){
int d,x,y;
scanf("%d",&d);
switch(d){
case 1:scanf("%d%d",&x,&y);update(1,n,1,id[x],id[x],y);break;
case 2:scanf("%d%d",&x,&y);update(1,n,1,id[x],mx[x],y);break;
case 3:scanf("%d",&x);printf("%lld\n",solvesum(x,1));break;
}
}
return 0;
}
bzoj4034: [HAOI2015]T2的更多相关文章
- BZOJ4034——[HAOI2015]T2
1.题目大意:用一个数据结构支持树的点修改和子树修改.树上路径和 2.分析:树链剖分裸题 #include <cstdio> #include <cstdlib> #inclu ...
- [BZOJ4034] [HAOI2015] T2 (树链剖分)
Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所 ...
- 【DFS序】【线段树】bzoj4034 [HAOI2015]T2
分开维护树的入栈序和出栈序,用两棵线段树.回答时就是用一颗的减去另一棵的. #include<cstdio> #include<algorithm> using namespa ...
- bzoj 4034 [HAOI2015] T2(树链剖分,线段树)
4034: [HAOI2015]T2 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1536 Solved: 508[Submit][Status] ...
- Bzoj 4034: [HAOI2015]T2 树链剖分,子树问题,dfs序
4034: [HAOI2015]T2 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1841 Solved: 598[Submit][Status] ...
- BZOJ 4034: [HAOI2015]T2( 树链剖分 )
树链剖分...子树的树链剖分序必定是一段区间 , 先记录一下就好了 ------------------------------------------------------------------ ...
- bzoj 4034: [HAOI2015]T2
4034: [HAOI2015]T2 Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操 ...
- 【bzoj4034】[HAOI2015]T2
siz[v]表示以v为根的子树的节点数 top[v]表示v所在的重链的顶端节点 fa[v]表示v的父亲 pos[v]表示v的父边标号 mx[v]表示v的子树中边的标号最大的那条边 参考:http:// ...
- 数据结构(树链剖分):BZOJ 4034: [HAOI2015]T2
Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中 ...
随机推荐
- ubuntu下cacti安装配置
参考文献 http://kling.blog.51cto.com/3320545/1180778 前言: 原本是想源码安装的,但是现在发现还是太麻烦了,就直接通过apt-get install安装了. ...
- Android的消息循环机制 Looper Handler类分析
Android的消息循环机制 Looper Handler类分析 Looper类说明 Looper 类用来为一个线程跑一个消息循环. 线程在默认情况下是没有消息循环与之关联的,Thread类在ru ...
- Android 从Gallery获取图片
本文主要介绍Android中从Gallery获取图片 设计项目布局 <LinearLayout xmlns:android="http://schemas.android.com/ap ...
- CSS 行内样式 页内样式 外部样式
行内标签: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF ...
- JS获取浏览器名和版本信息
Navigator 对象包含有关浏览器的信息. Navigator 对象属性和方法: <html> <head> <title>JS完整获取浏览器信息</ti ...
- Linux- Nginx简单的负载均衡(一)
这里先进行简单的nginx负载,安装nginx这里就不多说了,我们情景假设在已经安装好了nginx上: 1)查询nginx中的upstrea负载均衡模块 默认是有安装的.进入nginx源码目录中 . ...
- Java数组的12个常用方法
以下是12个关于Java数组最常用的方法,它们是stackoverflow得票最高的问题. 声明一个数组 String[] aArray = new String[5]; String[] bArra ...
- 配置mysql远程访问权限,大家可能掉过的那些坑~
1 作为互联网技术从业人 或者粗暴点说:作为一个程序猿.测试从业者 如果没掉过一些坑,都不好意思说自己混过技术圈 2 今天重点讲:mysql开启远程访问权限的那些坑- 对于mysql开启远程访 ...
- PlateSpin 完全复制由于LVM没有可用空闲空间导致失败
使用PlateSpin复制居然会由于LVM的卷组VG没有空闲可用的空间(available free space in the LVM volume group)创建快照而导致失败,特此记录一下:免得 ...
- 烂泥:openvpn双网卡客户端与内网机器通信
本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb. 前段时间写了一篇有关openvpn搭建与内网机器通信的文章,那篇文章是基于服务器单网卡 ...