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 为根的子树中 ...
随机推荐
- DevExtreme官方视频教程分享
收集在此,希望对使用这个工具的人有帮助 DevExtreme 1 2 3 4 5 6 DevExpress DevExtreme入门视频一:Getting Started DevExpress Dev ...
- 用Dart写的黑白棋游戏
2013年11月,Dart语言1.0稳定版SDK发布,普天同庆.从此,网页编程不再纠结了. 在我看来,Dart语法简直就是C#的升级版,太像了.之所以喜欢Ruby的一个重要理由是支持mixin功能,而 ...
- Python学习01 Hello World
Python学习之Hello World 准备工作 去官网http://www.python.org/ 下载python的安装包: http://www.python.org/download/ 当前 ...
- Android实现与PHP服务器的交互
今天算是有点小激动呢!拿到Android与PHP这个课题已经两个星期了,直到今天才算是有了一点点小收获. 虽然还是没能成功上传到服务器,不过已经看到了曙光,已经实现了一半了,那就是已经连接到了服务器. ...
- 【代码笔记】iOS-切换条
一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController ...
- Protocol and Delegate协议和代理
1.什么是协议? OC协议仿照Java的接口.协议和接口,都是不同类的对象之间一种通信的机制.2.协议的基础语法 单纯的语言描述协议的语法,很难让人理解,主要因为在OC中协议是类对象的通信机制,他 ...
- OC中的面向对象语法4
一. 继承 1. 继承的基本用法 l 设计两个类Bird.Dog // Bird的声明 @interface Bird : NSObject { @public int weight; } - (vo ...
- iOS 学习 - 10下载(2) NSURLSession 图片 篇
使用NSURLSessionDownloadTask下载文件的过程与前面差不多,需要注意的是文件下载文件之后会自动保存到一个临时目录,需要开发人员自己将此文件重新放到其他指定的目录中. // // V ...
- C#实现函数默认值和C#4.0实现默认值
static void Main(string[] args) { SayHello(); SayHello("侯志强"); Console.ReadKey(); } C#.0实现 ...
- 使用Web.Config Transformation配置灵活的配置文件
发布Asp.net程序的时候,开发环境和发布环境的Web.Config往往不同,比如connectionstring等.如果常常有发布的需求,就需要常常修改web.config文件,这往往是一件非常麻 ...