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为关 ...
随机推荐
- 【BZOJ】1706: [usaco2007 Nov]relays 奶牛接力跑
[题意]给定m条边的无向图,起点s,终点t,要求找出s到t恰好经过n条边的最短路径.n<=10^6,m<=100. [算法]floyd+矩阵快速幂 [题解] 先对点离散化,得到点数N. 对 ...
- Caffe提取任意层特征并进行可视化
现在Caffe的Matlab接口 (matcaffe3) 和python接口都非常强大, 可以直接提取任意层的feature map以及parameters, 所以本文仅仅作为参考, 更多最新的信息请 ...
- Markdown tutorial [repost]
1. italic We'll start by learning two basic elements in text formatting: italics and bold. In these ...
- uboot之---make smdk2410_config命令详细解析
先进入顶层Makefile.有很多相对不同板子的配置,如: gec2440_config:unconfig @$(MKCONFIG) $(@:_config=) arm arm920t gec2440 ...
- 超级ping(多线程版)
发现学校公共wifi的ip段是10.1.0-255.0-255段的,还是之前的思路批量ping一波. 其实可以使用nmap的.但是脚本写都写了.是吧.你懂的. #!/usr/bin/env pytho ...
- Metlnfo CMS全版本漏洞收集
根据https://www.seebug.org/appdir/MetInfo 进行书写. [版本:Metlnfo 4.0] 漏洞标题:Metlnfo cms任意用户密码修改 漏洞文件:member/ ...
- 在64位ubuntu中安装代码比较工具beyond compare
1,//从http://www.scootersoftware.com/download.php 官方地址下载 bcompare-3.3.2.14050.tar.gz 或 bcompare-4.0.7 ...
- 64_t5
texlive-mkpattern-svn15878.1.2-33.fc26.2.noarch..> 24-May-2017 15:54 38178 texlive-mkpic-bin-svn3 ...
- xcode7 安装 KSImageNamed
1.前往Xcode7的插件文件夹,路径如下: ~/Library/Developer/Xcode/Plug-ins 如果有KSImageNamed,右键删除 2.在终端直接输入命令行: default ...
- CSU 1102 多连块拼图
多连块拼图 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 多连块是指由多个等大正方形边与边连接而成的平面连通图形. ———— 维基百科 ...