51nod1648 洞 LCT

非常简单的一眼LCT,然而我没有在20min内码完,太失败了...
第一问,直接查根的前驱
第二问,查链的子树大小
复杂度$O((n + m) log n)$
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; extern inline char gc() {
static char RR[], *S = RR + , *T = RR + ;
if(S == T) fread(RR, , , stdin), S = RR;
return *S ++;
}
inline int read() {
int p = , w = ; char c = gc();
while(c > '' || c < '') { if(c == '-') w = -; c = gc(); }
while(c >= '' && c <= '') p = p * + c - '', c = gc();
return p * w;
} int wr[], rw;
#define pc(o) *W ++ = (o)
char WR[], *W = WR;
inline void write(int x, char c) {
if(!x) pc('');
if(x < ) x = -x, pc('-');
while(x) wr[++ rw] = x % , x /= ;
while(rw) pc(wr[rw --] + ''); pc(c);
} #define ri register int
#define sid 200500 #define ls(o) s[o][0]
#define rs(o) s[o][1]
int n, m, a[sid];
int fa[sid], s[sid][], rev[sid], sz[sid]; inline bool isr(int o) { return ls(fa[o]) != o && rs(fa[o]) != o; }
inline bool isrc(int o) { return rs(fa[o]) == o; }
inline void upd(int o) { sz[o] = sz[ls(o)] + sz[rs(o)] + ; } inline void rotate(int o) {
int f = fa[o], g = fa[f];
int ro = isrc(o), rf = isrc(f);
fa[o] = g; if(!isr(f)) s[g][rf] = o;
if(s[o][ro ^ ]) fa[s[o][ro ^ ]] = f;
s[f][ro] = s[o][ro ^ ]; fa[f] = o; s[o][ro ^ ] = f;
upd(f); upd(o);
} inline void prev(int o) {
swap(ls(o), rs(o));
rev[o] ^= ;
} inline void prv(int o) {
if(!rev[o]) return;
prev(ls(o)); prev(rs(o)); rev[o] = ;
} inline void pushrev(int o) {
if(!isr(o)) pushrev(fa[o]);
prv(o);
} void splay(int o) {
pushrev(o);
while(!isr(o)) {
int f = fa[o];
if(!isr(f)) rotate(isrc(o) == isrc(f) ? f : o);
rotate(o);
}
} void access(int o) {
for(ri t = ; o; t = o, o = fa[o])
splay(o), s[o][] = t, upd(o);
} inline void makeroot(int o) {
access(o); splay(o); prev(o);
} inline void link(int u, int v) {
makeroot(u); fa[u] = v;
} inline void cut(int u, int v) {
makeroot(u); access(v); splay(v);
s[v][] = ; fa[u] = ; upd(v);
} inline int get(int u) {
prv(u); u = s[u][]; prv(u);
while(s[u][]) u = s[u][], prv(u);
return u;
} inline void qry(int u) {
makeroot(n + ); access(u); splay(n + );
int ans2 = sz[n + ] - , ans1 = get(n + );
splay(ans1); write(ans1, ' '); write(ans2, '\n');
} int main() {
n = read(); m = read();
for(ri i = ; i <= n; i ++) {
a[i] = read();
if(i + a[i] <= n) link(i, i + a[i]);
else link(i, n + );
}
for(ri i = ; i <= m; i ++) {
int opt = read(), x = read();
if(opt == ) {
if(x + a[x] <= n) cut(x, x + a[x]); else cut(x, n + ); int y = read();
a[x] = y; if(x + a[x] <= n) link(x, x + a[x]); else link(x, n + );
} else qry(x);
}
fwrite(WR, , W - WR, stdout);
return ;
}
51nod1648 洞 LCT的更多相关文章
- BZOJ2049:Cave 洞穴勘测 (LCT入门)
辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好两个洞穴.假如两个洞穴可 ...
- 一堆LCT板子
搞了一上午LCT,真是累死了-- 以前总觉得LCT高大上不好学不好打,今天打了几遍感觉还可以嘛= =反正现在的水平应付不太难的LCT题也够用了,就这样好了,接下来专心搞网络流. 话说以前一直YY不出来 ...
- 三维网格补洞算法(Poisson Method)
下面介绍一种基于Poisson方程的三角网格补洞方法.该算法首先需要根据孔洞边界生成一个初始化补洞网格,然后通过法向估算和Poisson方程来修正补洞网格中三角面片的几何形状,使其能够适应并与周围的原 ...
- 三维网格补洞算法(Radial Basis Function)
在逆向工程中,由于设备或模型的原因,我们获取得到的三维模型数据往往并不完整,从而使得生成的网格模型存在孔洞,这对后续的模型分析会造成影响.下面介绍一种基于径向基函数(RBF:Radial Basis ...
- CH Round #72树洞[二分答案 DFS&&BFS]
树洞 CH Round #72 - NOIP夏季划水赛 描述 在一片栖息地上有N棵树,每棵树下住着一只兔子,有M条路径连接这些树.更特殊地是,只有一棵树有3条或更多的路径与它相连,其它的树只有1条或2 ...
- 动态树之LCT(link-cut tree)讲解
动态树是一类要求维护森林的连通性的题的总称,这类问题要求维护某个点到根的某些数据,支持树的切分,合并,以及对子树的某些操作.其中解决这一问题的某些简化版(不包括对子树的操作)的基础数据结构就是LCT( ...
- 在此为LCT开一个永久的坑
其实我连splay都还不怎么会. 今天先抄了黄学长的bzoj2049,以后一定要把它理解了. 写LCT怎么能不%数据结构大神yeweining呢?%%%chrysanthemums %%%切掉大森林 ...
- 【BZOJ2157】旅游 LCT
模板T,SB的DMoon..其实样例也是中国好样例...一开始不会复制,yangyang:找到“sample input”按住shift,按page down.... #include <ios ...
- 【BZOJ3669】[Noi2014]魔法森林 LCT
终于不是裸的LCT了...然而一开始一眼看上去这是kruskal..不对,题目要求1->n的路径上的每个点的两个最大权值和最小,这样便可以用LCT来维护一个最小生成路(瞎编的...),先以a为关 ...
随机推荐
- JavaScript计时器
计时器 基本格式: setInterval(function(){代码},1000): /* 说明:1.setInterval 会返回一个计时器ID值 可以这样接收.var setId = setIn ...
- 《Troubleshooting SQL Server》读书笔记-CPU使用率过高(上)
第三章 High CPU Utilization. CPU使用率过高问题很容易被发现,但是诊断却不是很容易.CPU使用过高很多时候会成为其它问题的替罪羊,所以在确认和故障诊断时要抽丝剥茧. 调查CPU ...
- BestCoder Round92
题目链接:传送门 HDU 6015-6018 解题报告:传送门 HDU6015 Skip the Class Accepts: 678 Submissions: 1285 Time Limit: ...
- Linux下命令lrzsz
lrzsz是什么 在使用Linux的过程中,难免少不了需要上传下载文件,比如往服务器上传一些war包之类的,之前都是使用winSCP,lrzsz是一个更方便的命令,可以直接在Linux中输入命令,弹出 ...
- D - Frog and Portal (利用斐波那契数列的性质)
题目链接:https://cn.vjudge.net/contest/270201#problem/D 具体思路:利用斐波那契数列的性质,斐波那契数列可以构成任何正整数,所以按照顺序减下去肯定能减到0 ...
- Fiddler 抓包工具总结(转)
阅读目录 1. Fiddler 抓包简介 1). 字段说明 2). Statistics 请求的性能数据分析 3). Inspectors 查看数据内容 4). AutoResponder 允许拦截制 ...
- Deep Learning基础--Softmax求导过程
一.softmax函数 softmax用于多分类过程中,它将多个神经元的输出,映射到(0,1)区间内,可以看成概率来理解,从而来进行多分类! 假设我们有一个数组,V,Vi表示V中的第i个元素,那么这个 ...
- Codeforces Round #502
Codeforces Round #502 C. The Phone Number 题目描述:求一个\(n\)排列,满足\(LIS+LDS\)最小 solution 枚举\(LIS\),可证明\(LD ...
- nginx解析带中文的url重定向之后404问题
首先,有这样一个需求:一个系统的图片存储是放在upyun上的,现在有个客户需要本地化部署,所以需要将图片进行本地存储.为了兼容,图片存储的路径格式保持和在upyun上的存储路径一致.在upyun上的存 ...
- Synergy,一个软件团队质量改进之路之一 --- 规划
关于质量改进 ISO9001:2000的核心思想是持续改进 ISO关于质量管理有8项原则: 原则一: 以顾客为关注焦点 原则二: 领导作用 原则三: 全员参与 原则四: 过程方法 原则五:管理的系统方 ...