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 的点权增 ...
随机推荐
- 【BZOJ】1419 Red is good
[算法]期望DP [题解]其实把状态表示出来就是很简单的期望DP. f[i][j]表示i张红牌,j张黑牌的期望. i=0时,f[0][j]=0. j=0时,f[i][0]=i. f[i][j]=max ...
- javascript中null与undefined的区别
1.null null是一个对象,表示一个空对象指针,typeof(null)返回object,null参与运算时会转化为0,将对象初始化为null,可以知道变量是否保存了对象的引用 2.undefi ...
- 集合框架源码学习之ArrayList
目录: 0-0-1. 前言 0-0-2. 集合框架知识回顾 0-0-3. ArrayList简介 0-0-4. ArrayList核心源码 0-0-5. ArrayList源码剖析 0-0-6. Ar ...
- document.onclick在ios上不触发的解决方法与touchstart点击穿透处理
document.onclick = function (e) { var e = e ? e : window.event; var tar = e.srcElement || e.target; ...
- "Flags mismatch irq" register interrupt handler error
Question : When you see the log "Flags mismatch irq ............", maybe you use the same ...
- java===java基础学习(5)---文件读取,写入操作
文件的写入读取有很多方法,今天学到的是Scanner和PrintWriter 文件读取 Scanner in = new Scanner(Paths.get("file.txt") ...
- Sqlserver获取所有数据库名,表信息,字段信息,主键信息,以及表结构等。
--获取所有数据库名: SELECT name FROM master..sysdatabases WHERE name NOT IN ( 'master', 'model', 'msdb', 'te ...
- 【Educational Codeforces Round 22】
又打了一场EDU,感觉这场比23难多了啊…… 艹还是我太弱了. A. 随便贪心一下. #include<bits/stdc++.h> using namespace std; ,ans=- ...
- 0x3F3F3F3F——ACM中的无穷大常量
在算法竞赛中,我们常常需要用到设置一个常量用来代表“无穷大”. 比如对于int类型的数,有的人会采用INT_MAX,即0x7fffffff作为无穷大.但是以INT_MAX为无穷大常常面临一个问题,即加 ...
- bzoj 1798 维护序列seq
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1798 题解: 高级一点的线段树,加上了区间乘法运算,则需要增加一个数组mulv记录乘的因数 ...