树链剖分模版题。

#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))--;elsecnt++, 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);}
}

转载于:https://www.cnblogs.com/NanoApe/p/4479736.html

BZOJ-1036 [ZJOI2008]树的统计相关推荐

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

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 3427  Solved: 1429 [Submi ...

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

    树链剖分: 把一棵树剖分为若干条链,然后利用数据结构(树状数组,SBT,Splay,线段树等等)去维护每一条链,复杂度 为O(logn),总体复杂度O(nlog²n) 步骤: ①将树的边分成重边和轻边 ...

  3. 洛谷 P2590 BZOJ 1036 [ZJOI2008]树的统计

    Time limit 10000 ms//另外,BZOJ只算所有点的总时限,所以可能会放过一些原本会TLE的代码 Memory limit 165888 kB OS Linux SourceZJOI2 ...

  4. BZOJ 1036 [ZJOI2008]树的统计Count

    以前动态树写过这个题,今天尝试树链剖分解决~ 模板题,就声明一点,线段树维护的是点权 View Code 1 #include <iostream> 2 #include <cstd ...

  5. 树链剖分 - BZOJ 1036: [ZJOI2008]树的统计Count

    这是树链剖分的入门题,也是我学树链剖分的第一题. 树链剖分:就是把树中和线段树联系起来,求(u,v)路径中权值的最大值和其路径的权值和. 入门blog:http://blog.sina.com.cn/ ...

  6. 【BZOJ 1036】 树的统计count

    题目 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成 一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: ...

  7. 1036: [ZJOI2008]树的统计Count

    链剖 1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 #include < ...

  8. 洛谷——P2590 [ZJOI2008]树的统计(树链剖分模板练手)

    P2590 [ZJOI2008]树的统计 I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值 III. QSUM u v: 询问 ...

  9. 洛谷 P2590 [ZJOI2008]树的统计

    P2590 [ZJOI2008]树的统计 题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把 ...

  10. 【BZOJ】【1036】树的统计

    嗯这题是一道对树进行动态修改&查询的经典题目,可以拿来练习树链剖分~ 啊对于这种动态修改&查询的题目,我们最喜闻乐见的就是在一个序列上去做了,毕竟可以直接套各种数据结构模版啊,比如线段 ...

最新文章

  1. 网络营销专员浅析如何面对网络营销过程中的降权处理
  2. 云计算和大数据时代网络技术揭秘(六)LISP协议
  3. [Bug]Object reference not set to an instance of an object.
  4. 时间序列 - 案例按步骤详解 -(SPSS建模)
  5. AngularJS表单操作几个例子(表单提交,表单编辑默认值)
  6. Mvc5 EF6 CodeFirst Mysql (一) 新建一个Mvc项目并使用EF连接到Mysql数据库
  7. Java基础篇:如何解决成员的访问和继承?
  8. 自然语言理解——词向量(一)
  9. 参考官方mysql自定义一个mysql sink connector
  10. Grammarly SCI语法检查总结
  11. Android实现立体滚轮控件,Camera和Matrix实现真正的3D(WheelView)滚轮控件
  12. 创建销售订单的BAPI
  13. 数字媒体技术在计算机技术中的应用,浅谈数字媒体技术的主要应用及发展趋势...
  14. C#字符串取第一个和最后一个字符
  15. 使用Hostapd开启AP功能
  16. Mysql Buffer Pool
  17. 苹果Swift语言入门教程
  18. 联通云服务器优势,多线云服务器有哪些优势?
  19. 基于机器学习中集成学习的stacking方式进行的金线莲质量鉴别研究(python进行数据处理并完成建模,对品种进行预测)
  20. 影响搜索引擎排名因素包括几个

热门文章

  1. pc服务器不同型号,服务器与PC系统软件之不同
  2. 基础的shell编程问题(一)
  3. leetcode323. 无向图中连通分量的数目
  4. 欧几里得gcd/extend_gcd
  5. C++:27---new delete malloc free
  6. pytorch学习 入门篇(一)
  7. python外卷(10)--取整
  8. Python(14)-模块
  9. 深度学习(01)-- 基础学习
  10. 经理人如何与这“六种人”打交道?