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 的点权增 ...
随机推荐
- [BZOJ1101&BZOJ2301][POI2007]Zap [HAOI2011]Problem b|莫比乌斯反演
对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a,y<=b,并且gcd(x,y)=d. 我们可以令F[n]=使得n|(x,y)的数对(x,y)个数 这个很容易得到,只需要让x, ...
- C++正则表达式例子
给了策划配置公式的地方,需要将策划配置的公式文本转化为可执行的脚本代码:比如:self->mHp*2+target->2mMp*GetHit()+ self_mon->4mDan/1 ...
- idea如何搭建springmvc4
1.推荐大牛博客 此操作我操作了三次过后终于成功了,奉献大牛博客连接:做的非常详细到位,望各位采纳,推荐置顶. https://www.cnblogs.com/chenlinghong/p/83395 ...
- jsp之jstl核心标签库
JSTL核心标签库技术 1. JSTL介绍 在JSP页面中即可书写html,也可以书写Java代码,导致页面混乱,维护,修改,升级难度加大,于是国际上不同的公司在实际应用中,根据页面的需求将Java代 ...
- skb管理函数之alloc_skb、dev_alloc_skb、kfree_skb、dev_kfree_skb、consume_skb
alloc_skb--分配skb dev_alloc_skb--分配skb,通常被设备驱动用在中断上下文中,它是alloc_skb的封装函数,因为在中断处理函数中被调用,因此要求原子操作(GFP_AT ...
- Linux线程基础函数
1. 线程标识: (1) 比较两个线程ID: #include <pthread.h> int pthread_equal(pthread_t tid1, pthread_t tid2); ...
- 手把手教你写Linux设备驱动---中断(三)--workqueue实现(基于友善之臂4412开发板) 【转】
转自:http://blog.csdn.net/morixinguan/article/details/69680909 上节,我们讲到如何来实现tasklet小任务机制 http://blog.cs ...
- Django2.0如何配置urls文件
刚开始学django,创建的第一个工程无法启动,后来发现是由于教程是针对较低版本的Django,我用的是Django2.0和Python3.6,两个都是发文为止的最新版本,urls文件设置方法和旧版本 ...
- 2017多校第6场 HDU 6105 Gameia 博弈
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6105 题意:Alice和Bob玩一个游戏,喷漆!现在有一棵树上边的节点最开始都没有被染色.游戏规则是: ...
- Kettle使用介绍——Kettle的安装与基本使用
下面的链接是原文 http://www.cnblogs.com/limengqiang/archive/2013/01/16/KettleApply1.html