http://www.lydsy.com/JudgeOnline/problem.php?id=1036

复习了一下好写好调的lct模板啦啦啦~~~

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; const int N = 30003; int n;
struct node *null;
struct node {
node *fa, *ch[2];
int w, sum, ma, rev;
bool pl() {return fa->ch[1] == this;}
bool check() {return fa == null || (fa->ch[0] != this && fa->ch[1] != this);}
void setc(node *r, int c) {ch[c] = r; if (r != null) r->fa = this;}
void count() {
sum = ch[0]->sum + ch[1]->sum + w;
ma = w;
if (ch[0] != null) ma = max(ma, ch[0]->ma);
if (ch[1] != null) ma = max(ma, ch[1]->ma);
}
void push() {if (rev) {swap(ch[0], ch[1]); rev = 0; ch[0]->rev ^= 1; ch[1]->rev ^= 1;}}
} pool[N]; namespace LCT {
void rotate(node *r) {
node *f = r->fa;
int c = r->pl();
if (f->check()) r->fa = f->fa;
else f->fa->setc(r, f->pl());
f->setc(r->ch[c ^ 1], c);
r->setc(f, c ^ 1);
f->count();
} void update(node *r) {if (!r->check()) update(r->fa); r->push();} void splay(node *r) {
update(r);
for (; !r->check(); rotate(r))
if (!r->fa->check()) rotate(r->pl() == r->fa->pl() ? r->fa : r);
r->count();
} node *access(node *r) {
node *y = null;
while (r != null) {
splay(r);
r->ch[1] = y;
y = r; r = r->fa;
}
return y;
} void changeroot(node *r) {access(r)->rev ^= 1; splay(r);}
void link(node *r, node *t) {changeroot(r); r->fa = t;}
int query_max(node *u, node *v) {changeroot(u); access(v); splay(v); return v->ma;}
int query_sum(node *u, node *v) {changeroot(u); access(v); splay(v); return v->sum;} int x[N], y[N];
void init() {
null = &pool[0];
null->fa = null->ch[0] = null->ch[1] = null;
null->ma = null->sum = null->rev = null->w = 0; scanf("%d", &n);
for (int i = 1; i < n; ++i) scanf("%d%d", x + i, y + i);
for (int i = 1; i <= n; ++i) {
pool[i].fa = pool[i].ch[0] = pool[i].ch[1] = null;
pool[i].rev = 0;
scanf("%d", &pool[i].w);
pool[i].ma = pool[i].sum = pool[i].w;
} for (int i = 1; i < n; ++i) link(&pool[x[i]], &pool[y[i]]);
}
} int main() {
LCT::init(); int q, u, v;
char s[18];
scanf("%d", &q);
while (q--) {
scanf("%s%d%d", s, &u, &v);
if (s[0] == 'C') {
LCT::splay(&pool[u]);
pool[u].w = pool[u].ma = pool[u].sum = v;
} else {
if (s[1] == 'M') printf("%d\n", LCT::query_max(&pool[u], &pool[v]));
else printf("%d\n", LCT::query_sum(&pool[u], &pool[v]));
}
}
return 0;
}

【BZOJ 1036】【ZJOI 2008】树的统计Count的更多相关文章

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

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

  2. 【BZOJ 1036】[ZJOI2008]树的统计Count

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1036 [题意] [题解] 树链剖分入门题; 每一条链维护一个线段树就好; uppest ...

  3. zjoi 2008 树的统计——树链剖分

    比较基础的一道树链剖分的题 大概还是得说说思路 树链剖分是将树剖成很多条链,比较常见的剖法是按儿子的size来剖分,剖分完后对于这课树的询问用线段树维护——比如求路径和的话——随着他们各自的链向上走, ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Bazinga(HDU5510+KMP)

    t题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5510 题目: 题意:找到一个编号最大的字符串满足:存在一个编号比它小的字符串不是它的字串. 思路:K ...

  2. bzoj 2669 状压DP

    因为最多有8个'X',所以我们可以用w[i][s]来表示现在我们填了前i个数,填的X的为S,因为每次新加进来的数都不影响前面的最小值,所以我们可以随便添加,这样就有了剩下所有位置的方案,每次都这样转移 ...

  3. bzoj 1058 bst

    因为是数列的维护,所以我们可以考虑用splay来维护,每次在x插入的时候就在x+1前面插入就行了,然后用bst来维护两问的答案,但是应该会tle.我们来考虑这个问题的性质,首先因为这个数列没有删除操作 ...

  4. js_开发小技巧记录(一)

    (一) 生成从minNum到maxNum的随机数 <!DOCTYPE html> <html> <head> <meta charset="UTF- ...

  5. shellcheck 帮助你写出更好的脚本

    简介 shellcheck 是一款实用的 shell脚本静态检查工具. 首先,可以帮助你提前发现并修复简单的语法错误,节约时间.每次都需要运行才发现写错了一个小地方,确实非常浪费时间. 其次,可以针对 ...

  6. MHA切换过程:

    1.监测master的状态Ping(SELECT) succeeded, waiting until MySQL doesn't respond.. 2.当监控发现master异常时发出warning ...

  7. Bzoj-2301 [HAOI2011]Problem b 容斥原理,Mobius反演,分块

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2301 题意:多次询问,求有多少对数满足 gcd(x,y)=k, a<=x<=b ...

  8. 2017多校第7场 HDU 6128 Inverse of sum 推公式或者二次剩余

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6128 题意:给你n个数,问你有多少对i,j,满足i<j,并且1/(ai+aj)=1/ai+1/a ...

  9. 初学者学习Javascript很吃力怎么办?到底该如何学习Js?

      Js给初学者的印象总是那么的“杂而乱”,相信很多初学者都在找轻松学习Js的途径.在这里给大家总结一些学习Js的经验,希望能给后来的学习者探索出一条“轻松学习Js之路”. Js给人那种感觉的原因多半 ...

  10. Eclipse+Pydev+numpy+scipy+matplotlib

    之前一直在linux环境下使用python,作为一枚小菜还是更喜欢windows.我使用python主要是进行科学计算,安装软件.搭建环境遇到了非常多的问题,特此总结. 一.python安装 版本:2 ...