树链剖分模版题。

#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cctype>
#include <cmath>
#define rep(i, l, r) for(int i=l; i<=r; i++)
#define clr(x, c) memset(x, c, sizeof(x))
#define travel(x) for(edge *p=fir[x]; p; p=p->n)
#define k(x) Key[x]
#define t(x) Tree[x]
#define s(x) Size[x]
#define b(x) Belong[x]
#define low(x) Lower[x]
#define dep(x) Deep[x]
#define h(x) Head[x]
#define l(x) Left[x]
#define r(x) Right[x]
#define w(x) Where[x]
#define maxn 30009
#define maxp 5000009
#define inf 0x7fffffff
using namespace std;
inline int read()
{
int x=0, f=1; char ch=getchar();
while (!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
while (isdigit(ch)) x=x*10+ch-'0', ch=getchar();
return x*f;
}
struct edge{int y; edge *n;} e[maxn*2], *fir[maxn], *pt=e;
inline void AddE(int x, int y)
{
pt->y=y, pt->n=fir[x], fir[x]=pt++;
pt->y=x, pt->n=fir[y], fir[y]=pt++;
}
int Tree[maxn], Size[maxn], Belong[maxn], Lower[maxn], Deep[maxn], Head[maxn], Where[maxn], cnt, Key[maxn];
int Left[maxp], Right[maxp], sum[maxp], big[maxp], z, L, R;
int n, d[maxn], h[maxn], now; void dfs(int x)
{
int maxs=-inf, maxl=0;
travel(x) if (p->y!=h[x])
{
h[p->y]=x, d[p->y]=d[x]+1; dfs(p->y);
if (s(b(p->y))>maxs) maxs=s(b(p->y)), maxl=p->y;
}
if (maxl)
b(x)=b(maxl), w(x)=w(maxl)+1, s(b(x))++, dep(b(x))--;
else
cnt++, b(x)=cnt, w(x)=1, s(cnt)=1, low(cnt)=x, dep(cnt)=d[x];
travel(x) if (p->y!=h[x] && p->y!=maxl) h(b(p->y))=x;
}
void BuildT(int&k, int l, int r, int t)
{
if (l==r){sum[t]=big[t]=k(k), k=h[k]; return;}
int mid=(l+r)>>1;
BuildT(k, l, mid, l(t)=++z), BuildT(k, mid+1, r, r(t)=++z);
sum[t]=sum[l(t)]+sum[r(t)], big[t]=max(big[l(t)], big[r(t)]);
}
inline void Build()
{
dfs(1); h(b(1))=0;
rep(i, 1, cnt) now=low(i), BuildT(now, 1, s(i), t(i)=++z);
} void Edit(int k, int y, int l, int r, int t)
{
if (l==r){sum[t]=big[t]=y; return;}
int mid=(l+r)>>1;
if (k<=mid) Edit(k, y, l, mid, l(t)); else Edit(k, y, mid+1, r, r(t));
sum[t]=sum[l(t)]+sum[r(t)], big[t]=max(big[l(t)], big[r(t)]);
}
inline void Change(int x, int y){k(x)=y; Edit(w(x), y, 1, s(b(x)), t(b(x)));} void QueryM(int l, int r, int t)
{
if (L<=l && r<=R) {now=max(now, big[t]); return;}
int mid=(l+r)>>1;
if (L<=mid) QueryM(l, mid, l(t));
if (mid<R) QueryM(mid+1, r, r(t));
}
inline void Qmax(int x, int y)
{
now=-inf; while (b(x)!=b(y))
{
if (dep(b(x))<dep(b(y))) swap(x, y);
L=w(x), R=s(b(x)), QueryM(1, s(b(x)), t(b(x))), x=h(b(x));
}
if (d[x]<d[y]) swap(x, y);
L=w(x), R=w(y), QueryM(1, s(b(x)), t(b(x)));
printf("%d\n", now);
}
void QueryS(int l, int r, int t)
{
if (L<=l && r<=R) {now+=sum[t]; return;}
int mid=(l+r)>>1;
if (L<=mid) QueryS(l, mid, l(t));
if (mid<R) QueryS(mid+1, r, r(t));
}
inline void Qsum(int x, int y)
{
now=0; while (b(x)!=b(y))
{
if (dep(b(x))<dep(b(y))) swap(x, y);
L=w(x), R=s(b(x)), QueryS(1, s(b(x)), t(b(x))), x=h(b(x));
}
if (d[x]<d[y]) swap(x, y);
L=w(x), R=w(y), QueryS(1, s(b(x)), t(b(x)));
printf("%d\n", now);
} int main()
{
n=read();
rep(i, 1, n-1) {int x=read(), y=read(); AddE(x, y);}
rep(i, 1, n) k(i)=read();
Build();
int q=read(); char ch[10];
rep(i, 1, q)
{
scanf("%s", ch); int x=read(), y=read();
if (ch[1]=='H') Change(x, y);
if (ch[1]=='S') Qsum(x, y);
if (ch[1]=='M') Qmax(x, y);
}
}

BZOJ-1036 [ZJOI2008]树的统计的更多相关文章

  1. BZOJ.1036 [ZJOI2008]树的统计Count ( 点权树链剖分 线段树维护和与最值)

    BZOJ.1036 [ZJOI2008]树的统计Count (树链剖分 线段树维护和与最值) 题意分析 (题目图片来自于 这里) 第一道树链剖分的题目,谈一下自己的理解. 树链剖分能解决的问题是,题目 ...

  2. BZOJ 1036: [ZJOI2008]树的统计Count [树链剖分]【学习笔记】

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 14302  Solved: 5779[Submit ...

  3. BZOJ 1036: [ZJOI2008]树的统计Count

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 14354  Solved: 5802 [Subm ...

  4. bzoj 1036 [ZJOI2008]树的统计Count(树链剖分,线段树)

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 10677  Solved: 4313[Submit ...

  5. Bzoj 1036: [ZJOI2008]树的统计Count 树链剖分,LCT

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 11102  Solved: 4490[Submit ...

  6. 数据结构(LCT动态树):BZOJ 1036: [ZJOI2008]树的统计Count

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 12266  Solved: 4945[Submit ...

  7. BZOJ 1036: [ZJOI2008]树的统计Count( 树链剖分 )

    树链剖分... 不知道为什么跑这么慢 = = 调了一节课啊跪.. ------------------------------------------------------------------- ...

  8. bzoj 1036: [ZJOI2008]树的统计Count 树链剖分+线段树

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 16294  Solved: 6645[Submit ...

  9. bzoj 1036: [ZJOI2008]树的统计Count (树链剖分+线段树 点权)

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 21194  Solved: 8589[Submit ...

  10. BZOJ 1036: [ZJOI2008]树的统计Count (树链剖分模板题)

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 14982  Solved: 6081[Submit ...

随机推荐

  1. E - Polycarp and Snakes

    E - Polycarp and Snakes 题意:在一个全是点的图上开始画线,每次将一行或一列任意长度染成字母,一笔染一种字母,字母必须从a开始连续到后面某个字母可以覆盖. 问所给图案是否满足 , ...

  2. kubernetes监控-Heapster+InfluxDB+Grafana(十五)

    cAdvisor+InfluxDB+Grafana cAdvisor:是谷歌开源的一个容器监控工具,采集主机上容器相关的性能指标数据.比如CPU.内存.网络.文件系统等. Heapster是谷歌开源的 ...

  3. python之函数的传参形参的第三种动态参数*args和**kwargs

    1. 位置/关键字传参的缺点 当给函数传入的参数数目不定时,之前的传参方式解决不了问题. def eat(food1,food2,food3): print(f'我请你吃:{food1},{food2 ...

  4. CF-1114 (2019/02/11)

    CF-1114 A. Got Any Grapes? skip B. Yet Another Array Partitioning Task 将n个数分成连续的k组,使得每组的前m大的数字的总和最大. ...

  5. 【上下界网络流 费用流】bzoj2055: 80人环游世界

    EK费用流居然写错了…… Description     想必大家都看过成龙大哥的<80天环游世界>,里面的紧张刺激的打斗场面一定给你留下了深刻的印象.现在就有这么     一个80人的团 ...

  6. spring boot自动配置实现

    自从用了spring boot,都忘记spring mvc中的xml配置是个什么东西了,再也回不去.为啥spring boot这么好用呢, 约定大于配置的设计初衷, 让我们只知道维护好applicat ...

  7. 笔记--Day1--python基础1

    一.目录 1.Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum),目前已经是使用频度特别高的开发语言. 主要应用领域: 云计算:云计算最火的语言,典型应用有Op ...

  8. 03等待多个线程返回WaitForMultipleObject

    二. WaitForMultipleObject 等待单个线程返回 1. 函数原型 DWORD WINAPI WaitForMultipleObjects( _In_ DWORD nCount, _I ...

  9. 解决linux不能解压rar格式压缩包

    1download rarlinux-x64-5.3.0.tar.gz data package 2.tar xvf rarlinux-64-5.3.0.tar.gz 3. cd rar and th ...

  10. 事务控制语言DTL

    一.什么是事务? · 数据库中的事务,是指可以将“多条相关语句执行”看做是“一条语句执行”的一种内部机制.即事务是一种可以保证“多条语句一次性执行完成”或者一条语句都不执行的机制. 三.事务的特点 原 ...