树链剖分裸题:

树剖点这里:传送门

代码:

#include<bits/stdc++.h>
#define sight(c) ('0'<=c&&c<='9')
#define LL long long
#define gc nc
#define add(x,y) x+=(y)
#define L(x) (x&-x)
#define eho(x) for(int i=head[x];i;i=net[i])
#define N 100007
#define abs(x) ((x)>0?(x):(-x))
LL q1[N],q2[N],gg,sum[N],a[N],T,G;
int tot,fall[N<<],net[N<<],head[N],top[N],son[N],f[N],dp[N],siz[N],be[N],ed[N],ok
,n,m,A,B,t[N],op,x,y,z,dla,OS;
inline char nc(){
static char buf[],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,,,stdin),p1==p2)?EOF:*p1++;
}
inline void swap(int &x,int &y) {x^=y; y^=x; x^=y;}
inline void read(LL &x){
static char c; static int b;
for(b=,c=gc();!sight(c);c=gc()) if (c=='-') b=-;
for(x=;sight(c);c=gc()) x=x*+c-; x*=b;
}
inline void read(int &x){
static char c; static int b;
for(b=,c=gc();!sight(c);c=gc()) if (c=='-') b=-;
for(x=;sight(c);c=gc()) x=x*+c-; x*=b;
}
void write(LL x){if (x<) {putchar(''+x);return;}write(x/); putchar(''+x%);}
void writes(LL x){if (x<) putchar('-'); write(abs(x));}
inline void ADd(int x,int y) {
fall[++tot]=y; net[tot]=head[x]; head[x]=tot;
}
inline void Add(LL *A,int x,LL dla) {for (;x<N;x+=L(x)) add(A[x],dla);}
inline void adds(int l,int r,LL x) {
Add(q1,l,x); Add(q1,r+,-x); Add(q2,l,l*x); Add(q2,r+,-(r+)*x);
}
inline LL Query(LL *A,int x){for(G=;x;x-=L(x)) add(G,A[x]);return G;}
inline LL qurey(int l){
return (sum[l]+(l+)*1ll*Query(q1,l)-Query(q2,l));
}
void dfs(int x,int fa){
siz[x]=; son[x]=-; dp[x]=dp[fa]+; f[x]=fa;
eho(x) if (fall[i]^fa) {
dfs(fall[i],x); siz[x]+=siz[fall[i]];
if ((!(~son[x]))||siz[fall[i]]>siz[son[x]]) son[x]=fall[i];
}
}
void dfs2(int x,int las){
t[++ok]=x;top[x]=las; be[x]=ok;
if (~son[x]) dfs2(son[x],las);
eho(x) if ((fall[i]^f[x])&&(fall[i]^son[x])) dfs2(fall[i],fall[i]); ed[x]=ok;
}
void apd(int x,int y,LL dla){
while (top[x]!=top[y]) {
if (dp[top[x]]<dp[top[y]]) swap(x,y);
adds(be[top[x]],be[x],dla);
x=f[top[x]];
} if (dp[x]>dp[y]) swap(x,y);
adds(be[x],be[y],dla);
}
LL query_path(int x,int y) {
LL O=;
while (top[x]!=top[y]) {
if (dp[top[x]]<dp[top[y]]) swap(x,y);
add(O,qurey(be[x])-qurey(be[top[x]]-));
x=f[top[x]];
} if (dp[x]>dp[y]) swap(x,y);
add(O,qurey(be[y])-qurey(be[x]-));
return O;
}
signed main () {
// freopen("a.in","r",stdin);
read(n); read(m);
for (int i=;i<=n;i++) read(a[i]);
for (int i=;i<n;i++) {read(A); read(B); ADd(A,B); ADd(B,A); }
dfs(n,); dfs2(n,n);
for (int i=;i<=n;i++) sum[i]=sum[i-],add(sum[i],a[t[i]]);
while (m--) {
read(op);
switch (op) {
case : read(x); read(z); adds(be[x],be[x],z); break;
case : read(x); read(z); adds(be[x],ed[x],z); break;
case : read(x); writes(query_path(,x)); putchar('\n'); break;
}
} return ;
}

树上操作[HAOI 2015]的更多相关文章

  1. cogs 1963. [HAOI 2015] 树上操作 树链剖分+线段树

    1963. [HAOI 2015] 树上操作 ★★★☆   输入文件:haoi2015_t2.in   输出文件:haoi2015_t2.out   简单对比时间限制:1 s   内存限制:256 M ...

  2. 【BZOJ4034】[HAOI2015]树上操作 树链剖分+线段树

    [BZOJ4034][HAOI2015]树上操作 Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 ...

  3. HAOI2015 树上操作

    HAOI2015 树上操作 题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种:操作 1 :把某个节点 x 的点权增加 a .操作 2 :把某个节点 x 为根 ...

  4. bzoj千题计划242:bzoj4034: [HAOI2015]树上操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=4034 dfs序,树链剖分 #include<cstdio> #include<io ...

  5. bzoj4034[HAOI2015]树上操作 树链剖分+线段树

    4034: [HAOI2015]树上操作 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 6163  Solved: 2025[Submit][Stat ...

  6. 树剖||树链剖分||线段树||BZOJ4034||Luogu3178||[HAOI2015]树上操作

    题面:P3178 [HAOI2015]树上操作 好像其他人都嫌这道题太容易了懒得讲,好吧那我讲. 题解:第一个操作和第二个操作本质上是一样的,所以可以合并.唯一值得讲的点就是:第二个操作要求把某个节点 ...

  7. P3178 [HAOI2015]树上操作

    P3178 [HAOI2015]树上操作 思路 板子嘛,其实我感觉树剖没啥脑子 就是debug 代码 #include <bits/stdc++.h> #define int long l ...

  8. bzoj 4034: [HAOI2015]树上操作 树链剖分+线段树

    4034: [HAOI2015]树上操作 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 4352  Solved: 1387[Submit][Stat ...

  9. bzoj 4034: [HAOI2015]树上操作 (树剖+线段树 子树操作)

    4034: [HAOI2015]树上操作 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 6779  Solved: 2275[Submit][Stat ...

随机推荐

  1. windows平台下基于QT和OpenCV搭建图像处理平台

        在之前的博客中,已经分别比较详细地阐述了"windows平台下基于VS和OpenCV"以及"Linux平台下基于QT和OpenCV"搭建图像处理框架,并 ...

  2. codeforces 630C - Lucky Numbers 递推思路

    630C - Lucky Numbers 题目大意: 给定数字位数,且这个数字只能由7和8组成,问有多少种组合的可能性 思路: 假设为1位,只有7和8:两位的时候,除了77,78,87,88之外还哇哦 ...

  3. PHP扩展安装方法

    php扩展安装方法极简单. 也遵循3大步.但多出一个phpize的步骤. 1.pecl.php.net  在右上解的输入框 中输入需要的扩展    比如 redis 2.搜索完成后会看到两个蓝色的框 ...

  4. C++ IO操作API及注意事项(包含一个日志类的实现)

    C++是一个抽象程度比C高很多的语言,在使用C++时,编译器做了很多工作,如果我们不对C++的某些特性的实现机制进行了解,那么编程时也许会有很多疑惑,我们也许知道怎样做才是正确的,但不知道为什么要这样 ...

  5. 》》Jqurey html

    第1部分:jQuery HTML 1.获取内容和属性 -- 获取内容: text():设置或获取所选元素的文本内容 html():设置或获取所选元素的内容(包括HTML标记) val():设置或获取表 ...

  6. BIRT实现组内跨行计算

    问题来源:http://developer.actuate.com/community/forum/index.php?/topic/36160-dealing-with-previous-rows- ...

  7. Android酷炫有用的开源框架

    一.代码库 1.from  代码家 整理比較好的源代码连接 一.兼容类库 ActionBarSherlock : Action Bar是Android 3.0后才開始支持的,ActionBarSher ...

  8. C - The C Answer (2nd Edition) - Exercise 1-7

    /* Write a program to print the value of EOF. */ #include <stdio.h> main() { printf("EOF ...

  9. 使用Mybatis-Generator自己主动生成Dao、Model、Mapping相关文件

    准备工作: 1.数据库驱动程序 2.generatorConfig驱动,(下载地址:https://github.com/mybatis/generator/releases) 3.generator ...

  10. Java加载资源文件的两种方法

    处理配置文件对于Java程序员来说再常见不过了,不管是Servlet,Spring,抑或是Structs,都需要与配置文件打交道.Java将配置文件当作一种资源(resource)来处理,并且提供了两 ...