【BZOJ 1036】【ZJOI 2008】树的统计Count
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的更多相关文章
- BZOJ 1036: [ZJOI2008]树的统计Count(树链剖分)
树的统计CountDescription一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改 ...
- 【BZOJ 1036】[ZJOI2008]树的统计Count
[题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1036 [题意] [题解] 树链剖分入门题; 每一条链维护一个线段树就好; uppest ...
- zjoi 2008 树的统计——树链剖分
比较基础的一道树链剖分的题 大概还是得说说思路 树链剖分是将树剖成很多条链,比较常见的剖法是按儿子的size来剖分,剖分完后对于这课树的询问用线段树维护——比如求路径和的话——随着他们各自的链向上走, ...
- BZOJ.1036 [ZJOI2008]树的统计Count ( 点权树链剖分 线段树维护和与最值)
BZOJ.1036 [ZJOI2008]树的统计Count (树链剖分 线段树维护和与最值) 题意分析 (题目图片来自于 这里) 第一道树链剖分的题目,谈一下自己的理解. 树链剖分能解决的问题是,题目 ...
- BZOJ 1036: [ZJOI2008]树的统计Count [树链剖分]【学习笔记】
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 14302 Solved: 5779[Submit ...
- BZOJ 1036: [ZJOI2008]树的统计Count
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MB Submit: 14354 Solved: 5802 [Subm ...
- bzoj 1036 [ZJOI2008]树的统计Count(树链剖分,线段树)
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 10677 Solved: 4313[Submit ...
- Bzoj 1036: [ZJOI2008]树的统计Count 树链剖分,LCT
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 11102 Solved: 4490[Submit ...
- 数据结构(LCT动态树):BZOJ 1036: [ZJOI2008]树的统计Count
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 12266 Solved: 4945[Submit ...
- BZOJ 1036: [ZJOI2008]树的统计Count( 树链剖分 )
树链剖分... 不知道为什么跑这么慢 = = 调了一节课啊跪.. ------------------------------------------------------------------- ...
随机推荐
- Bzoj4873 [SXOI2017]寿司餐厅
Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 64 Solved: 45 Description Kiana最近喜欢到一家非常美味的寿司餐厅用餐.每 ...
- 【NOIP】提高组2016 愤怒的小鸟
[题意]Universal Online Judge [算法]状态压缩型DP [题解]看数据范围大概能猜到是状压了. 根据三点确定一条抛物线,枚举两个点之间的抛物线,再枚举有多少点在抛物线上(压缩为状 ...
- quick-cocos2d-x数据存储 UserDefault GameState io
看了quick-cocos2d-x 的framework,发现里面有一个GameState,查了下,是数据存储的类,于是稍稍总结下我用到过的数据存储方式吧. 一共是三种方法: cc.UserDefau ...
- scrapy学习笔记一
以前写爬虫都是直接手写获取response然后用正则匹配,被大佬鄙视之后现在决定开始学习scrapy 一.安装 pip install scrapy 二.创建项目 scrapy startprojec ...
- js_页面关闭beforeunload事件
做圆桌爆文公众号的时候,需要对阅读的文章进行时间统计.是这个公众号的核心功能,客户把文章转发到朋友圈或者转给朋友,记录谁阅读此文章和阅读时长进行记录,从而展示给客户. 功能点是,关闭页面时触发事件,请 ...
- python中的Queue模块
queue介绍 queue是python的标准库,俗称队列.可以直接import引用,在python2.x中,模块名为Queue.python3直接queue即可 在python中,多个线程之间的数据 ...
- Linux中查看进程占用内存的情况【转】
转自:http://hutaow.com/blog/2014/08/28/display-process-memory-in-linux/ Linux中查看某个进程占用内存的情况,执行如下命令即可,将 ...
- 神秘的subsys_initcall【转】
转自:http://blog.chinaunix.net/uid-12567959-id-161015.html 在内核代码里到处都能看到这个subsys_initcall(),而它到底是干什么的呢? ...
- Linux的SMP,UMA,NUMA
SMP 是Symmetric Multi-Processing的意思,对称多处理器,一种多核结构,认为这些核是完全同构的,任务可以随便在任一个核上跑. UMA是Uniform Memory Acces ...
- centos6.5升级Linux内核步骤
centos6.5升级Linux内核步骤 http://www.jianshu.com/p/c75f00182b4c 使用的操作系统是是centos6.5,按照官方的推荐的配置,把linux内核升级到 ...