JZYZOJ1539[haoi2015]T2 树链剖分
http://172.20.6.3/Problem_Show.asp?id=1539
在学校的OJ又写了一次,RE了好多次,原来haoi的时候这道题需要开栈+快读,裸数据结构30分,加上快读50分。
oi考试的时候原来不能汇编开栈,只能写手工栈orz(递归变循环那种),学长说当时省选最高分50,本来以为很简单的题没想到这么套路。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define lc x*2
#define rc x*2+1
const int maxn=;
int n,m;
long long a[maxn]={};
struct nod{
int y,next;
}e[maxn*];
int head[maxn]={},tot=;
long long fa[maxn]={},dep[maxn]={},siz[maxn]={};
long long kid[maxn]={},top[maxn]={},val[maxn]={};
struct seg{
long long l,r,v,w,siz;
seg(){l=r=v=w=siz=;}
}t[maxn*];
void init(long long x,long long y){
e[++tot].y=y;e[tot].next=head[x];head[x]=tot;
}
int build1(int x,int pa){
int y,hug=,si,tsn=;fa[x]=pa;
for(int i=head[x];i;i=e[i].next){
y=e[i].y;
if(y==pa)continue;
si=build1(y,x);tsn+=si;
if(si>hug)hug=si,kid[x]=y;
}return siz[x]=tsn;
}
void build2(int x,int pa){
int y;dep[x]=++tot;top[x]=pa;
val[dep[x]]=a[x];
if(kid[x])build2(kid[x],pa);
for(int i=head[x];i;i=e[i].next){
y=e[i].y;
if(y==kid[x]||y==fa[x])continue;
build2(y,y);
}
}
void pushup(int x){
if(t[x].siz>)t[x].v=t[lc].v+t[rc].v;
t[x].v+=t[x].w*t[x].siz;
}
void build(int x,int l,int r){
t[x].r=r;t[x].l=l;t[x].siz=r-l+;
if(l==r){t[x].v=val[l];return;}
int mid=(l+r)/;
build(lc,l,mid);
build(rc,mid+,r);
pushup(x);
}
void add(int x,int l,int r,long long w){
if(l<=t[x].l&&t[x].r<=r){
if(t[x].l==t[x].r)t[x].v+=w;
else t[x].w+=w;pushup(x);
return;
}
int mid=(t[x].l+t[x].r)/;
if(l<=mid)add(lc,l,r,w);
if(r>mid)add(rc,l,r,w);
pushup(x);
}
long long sum(int x,int l,int r,long long w){
if(l<=t[x].l&&t[x].r<=r){
return t[x].v+t[x].siz*w;
}
int mid=(t[x].l+t[x].r)/;long long ans=;
if(l<=mid)ans+=sum(lc,l,r,w+t[x].w);
if(r>mid)ans+=sum(rc,l,r,w+t[x].w);
return ans;
}
long long doit(int x){
int a=top[x];long long ans=;
while(a!=){
ans+=sum(,dep[a],dep[x],);
x=fa[a];a=top[x];
}
ans+=sum(,dep[a],dep[x],);
return ans;
}
long long read(){
char ch=getchar();long long x=,f=;
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x*=;x+=ch-'';ch=getchar();}
return x*f;
}
int main(){
//freopen("wtf.in","r",stdin);
int size = << ; // 256MB
char *p = (char*)malloc(size) + size;
__asm__("movl %0, %%esp\n" :: "r"(p));
n=read();m=read();int x,y,v;
for(int i=;i<=n;i++)a[i]=read();
for(int i=;i<n;i++){x=read();y=read();init(x,y);init(y,x);}
tot=;build1(,);build2(,);
build(,,n);
for(int i=;i<=m;i++){
scanf("%d",&v);
if(v==){
scanf("%d%d",&x,&y);
add(,dep[x],dep[x],y);
}
else if(v==){
scanf("%d%d",&x,&y);
add(,dep[x],dep[x]+siz[x]-,y);
}
else{
scanf("%d",&x);
printf("%I64d\n",doit(x));
}
}
return ;
}
JZYZOJ1539[haoi2015]T2 树链剖分的更多相关文章
- 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( 树链剖分 )
树链剖分...子树的树链剖分序必定是一段区间 , 先记录一下就好了 ------------------------------------------------------------------ ...
- [BZOJ4034] [HAOI2015] T2 (树链剖分)
Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所 ...
- bzoj 4034 [HAOI2015] T2(树链剖分,线段树)
4034: [HAOI2015]T2 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1536 Solved: 508[Submit][Status] ...
- BZOJ 4034 [HAOI2015]T2(树链剖分)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4034 [题目大意] 有一棵点数为 N 的树,以点 1 为根,且树点有边权. 有 M 个 ...
- bzoj4034[HAOI2015]树上操作 树链剖分+线段树
4034: [HAOI2015]树上操作 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 6163 Solved: 2025[Submit][Stat ...
- bzoj 4034: [HAOI2015]树上操作 树链剖分+线段树
4034: [HAOI2015]树上操作 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 4352 Solved: 1387[Submit][Stat ...
- BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 )
BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 ) 题意分析 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 ...
- [HAOI2015]树上操作(树链剖分)
[HAOI2015]树上操作(luogu) Description 题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种: 操作 1 :把某个节点 x 的点权增 ...
随机推荐
- 21、python操作redis的模块?
什么是redis? redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(s ...
- js_setCookie,getCookie和checkcookie函数
随便说说: cookie和sessionStrong,localStrong在web应用中都有一种存储的功能,也就是说可以把一些数据记录在浏览器.cookie和后两者的主要区别 是cookie是和后端 ...
- solaris如何启动ssh服务
先查看一下ssh服务状态:# svcs或# svcs | grep sshonline Aug_07 svc:/network/ssh:default 如需要关闭ssh服务(关闭完可以 svcs | ...
- 顺序图(Sequence Diagram)
顺序图(Sequence Diagram): 是一种强调对象间消息传递次序的交互图,又称为时序图或序列图.描述了在一个用例或操作的执行过程中对象如何通过消息相互交互,说明了消息如何在对象之间被发送和接 ...
- Eureka服务续约(Renew)源码分析
主要对Eureka的Renew(服务续约),从服务提供者发起续约请求开始分析,通过阅读源码和画时序图的方式,展示Eureka服务续约的整个生命周期.服务续约主要是把服务续约的信息更新到自身的Eurek ...
- java===java基础学习(16)---final
final-----概念 1.当不希望父类的某个方法被子类覆盖(override)时,可以用final关键字修饰. 2.当不希望类的某个变量的值被修改时,可以用final修饰.如果要用final,则必 ...
- 【模板】BZOJ 3781: 小B的询问 莫队算法
http://www.lydsy.com/JudgeOnline/problem.php?id=3781 N个数的序列,每次询问区间中每种数字出现次数的平方和,可以离线. 丢模板: #include ...
- 尽量用const,enum,inline代替define
在读<Effective C++>之前,我确实不知道const,enum,inline会和define扯上什么关系,看完感觉收获很大,记录之. define: 宏定义. 在编译预处理时,对 ...
- C#ActiveX控件开发
1.新建项目,选择C#,选择.NET Framework2.0,新建一个Windows窗体控件库项目,命名为ActiveXDemo; 2.右击ActiveXDem项目,选择属性——应用程序——程序集信 ...
- 第一次用python编写的小程序
print ("*******数字游戏*********")temp = input ("猜猜小红现在心里想的是什么数字呢?")guess = int(temp ...