Solution

由于链信息不好直接维护, 所以新建一个节点存储边的权值, 并把这个节点连向 它所连的节点 $u$, $v$

$pushup$中更新维护的 $mx$ 指向路径上权值最大的边的编号。

由于这题是只有删边, 没有添边, 所以可以离线倒序, 把删边变成添边。

Code

 #include<cstdio>
#include<cstring>
#include<algorithm>
#define rd read()
using namespace std; const int N = 1e6 + ; int n, m, Q, ans[N]; struct edge {
int u, v, id, val, d;
}e[N]; struct que {
int typ, u, v, id;
}q[N]; int read() {
int X = , p = ; char c = getchar();
for (; c > '' || c < ''; c = getchar())
if (c == '-') p = -;
for (; c >= '' && c <= ''; c = getchar())
X = X * + c - '';
return X * p;
} namespace LCT {
int ch[N][], f[N], mx[N], tun[N], val[N];
int st[N], tp;
#define lc(x) ch[x][0]
#define rc(x) ch[x][1] int isroot(int x) {
return rc(f[x]) != x &&
lc(f[x]) != x;
} int get(int x) {
return rc(f[x]) == x;
} void rev(int x) {
swap(lc(x), rc(x));
tun[x] ^= ;
} void pushdown(int x) {
if (tun[x]) {
if (lc(x)) rev(lc(x));
if (rc(x)) rev(rc(x));
tun[x] = ;
}
} void pd(int x) {
while (!isroot(x)) {
st[++tp] = x;
x = f[x];
}
st[++tp] = x;
while (tp) pushdown(st[tp--]);
} void up(int x) {
mx[x] = val[x];
if (e[mx[lc(x)]].val > e[mx[x]].val) mx[x] = mx[lc(x)];
if (e[mx[rc(x)]].val > e[mx[x]].val) mx[x] = mx[rc(x)];
} void rotate(int x) {
int old = f[x], oldf = f[old], son = ch[x][get(x) ^ ];
if (!isroot(old)) ch[oldf][get(old)] = x;
ch[x][get(x) ^ ] = old;
ch[old][get(x)] = son;
f[x] = oldf; f[old] = x; f[son] = old;
up(old); up(x);
} void splay(int x) {
pd(x);
for (; !isroot(x); rotate(x))
if (!isroot(f[x]))
rotate(get(f[x]) == get(x) ? f[x] : x);
} void access(int x) {
for (int y = ; x; y = x, x = f[x])
splay(x), ch[x][] = y, up(x);
} void mroot(int x) {
access(x);
splay(x);
rev(x);
} void split(int x, int y) {
mroot(x);
access(y);
splay(y);
} int findr(int x) {
access(x); splay(x);
while (lc(x)) pushdown(x), x = lc(x);
return x;
} void link(int x, int y) {
mroot(x); f[x] = y;
} void cut(int x, int y) {
split(x, y);
f[x] = ch[y][] = ;
}
}
using namespace LCT; int fd(int x, int y) {
int l = , r = m;
for (; l <= r;) {
int mid = (l + r) >> ;
if (e[mid].u < x || (e[mid].u == x && e[mid].v < y))
l = mid + ;
else if (e[mid].u == x && e[mid].v == y) return mid;
else r = mid - ;
}
return ;
} int cmp1(const edge &A, const edge &B) {
return A.val < B.val;
} int cmp2(const edge &A, const edge &B) {
return A.u == B.u ? A.v < B.v : A.u < B.u;
} int cmp3(const edge &A, const edge &B) {
return A.id < B.id;
} int main()
{
n = rd; m = rd; Q = rd;
for (int i = ; i <= m; ++i) {
e[i].u = rd, e[i].v = rd, e[i].val = rd;
if (e[i].u > e[i].v)
swap(e[i].u, e[i].v);
}
sort(e + , e + + m, cmp1);
for (int i = ; i <= m; ++i)
e[i].id = i, val[i + n] = i;
sort(e + , e + + m, cmp2);
for (int i = ; i <= Q; ++i) {
q[i].typ = rd;
q[i].u = rd;
q[i].v = rd;
if (q[i].u > q[i].v)
swap(q[i].u, q[i].v);
if (q[i].typ == ) {
int t = fd(q[i].u, q[i].v);
q[i].id = e[t].id;
e[t].d = ;
}
}
sort(e + , e + + m, cmp3);
for (int i = , tot = ; i <= m; ++i) if (!e[i].d) {
int x = e[i].u, y = e[i].v;
mroot(x);
if (findr(y) != x) {
link(x, i + n);
link(y, i + n);
tot++;
}
if (tot == n - ) break;
}
for (int i = Q; i; i--) {
if (q[i].typ == ) {
split(q[i].u, q[i].v);
ans[i] = e[mx[q[i].v]].val;
}
else {
int x = q[i].u, y = q[i].v;
mroot(x);
if (findr(y) != x) {
link(y, q[i].id + n);
link(x, q[i].id + n);
continue;
}
if (e[mx[y]].val > e[q[i].id].val) {
int t = mx[y];
cut(t + n, e[t].u);
cut(t + n, e[t].v);
link(q[i].id + n, x);
link(q[i].id + n, y);
}
}
}
for (int i = ; i <= Q; ++i)
if (q[i].typ == )
printf("%d\n", ans[i]);
}

BZOJ 2594 水管局长 - LCT 维护链信息的更多相关文章

  1. [BZOJ]2594 水管局长数据加强版(Wc2006)

    失踪人口回归. LCT一直是小C的弱项,特别是这种维护链的信息的,写挂了就会调代码调到心态爆炸. 不过还好这一次的模板练习没有出现太多的意外. Description SC省MY市有着庞大的地下水管网 ...

  2. bzoj 2594: 水管局长数据加强版 Link-Cut-Tree

    题目: Description SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公 ...

  3. BZOJ 2594 水管局长数据加强版

    LCT维护最小生成树 要求两点路径最大的最小,首先想到的肯定是最小生成树,再加上有删边操作,那就得用LCT维护了. 可是对于cut一条边,我们要时刻维护图中的最小生成树,需要把之前被我们淘汰的边找回, ...

  4. Luogu 4234 最小差值生成树 - LCT 维护链信息

    Solution 将边从小到大排序, 添新边$(u, v)$时 若$u,v$不连通则直接添, 若连通则 把链上最小的边去掉 再添边. 若已经加入了 $N - 1$条边则更新答案. Code #incl ...

  5. BZOJ 2594 水管局长数据加强版(动态树)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2594 题意:给出一个无向图,边有权值.定义一条路径的长度为该路径所有边的最大值.两种操作 ...

  6. 洛谷3613睡觉困难综合征(LCT维护链信息(前后缀)+贪心)

    这个题目还是很好啊QWQ很有纪念意义 首先,如果在序列上且是单次询问的话,就是一个非常裸的贪心了QWQ这也是NOI当时原题的问题和数据范围 我们考虑上树的话,应该怎么做? 我的想法是,对于每一位建一个 ...

  7. P4172 [WC2006]水管局长 LCT维护最小生成树

    \(\color{#0066ff}{ 题目描述 }\) SC 省 MY 市有着庞大的地下水管网络,嘟嘟是 MY 市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的 ...

  8. luogu P4172 [WC2006]水管局长 LCT维护动态MST + 离线

    Code: #include<bits/stdc++.h> #define maxn 1200000 #define N 120000 using namespace std; char ...

  9. 洛谷.4172.[WC2006]水管局长(LCT Kruskal)

    题目链接 洛谷(COGS上也有) 不想去做加强版了..(其实处理一下矩阵就好了) 题意: 有一张图,求一条x->y的路径,使得路径上最长边尽量短并输出它的长度.会有<=5000次删边. 这 ...

随机推荐

  1. js高级-浏览器事件循环机制Event Loop

    JavaScript 是队列的形式一个个执行的 同一时间只能执行一段代码,单线程的  (队列的数据结构) 浏览器是多线程的 JavaScript执行线程负责执行js代码 UI线程负责UI展示的 Jav ...

  2. SPSS-生存分析

    生存分析 定义:一些医学事件所经历的时间:从开始观察到事件发生的时间,不是短期内可以明确判断的.针对这类生存资料的分析方法叫生存分析.生存分析的基本概念1.终点事件终点事件outcome event: ...

  3. php数组按值的大小排序

    array_multisort(array_column($nima,'zongfen'),SORT_DESC,$nima);

  4. C++字符串和向量

    陷阱:C字符串使用=和== char a_string[10]; a_string="Hello"  非法 strcpy(a_string,"Hello");  ...

  5. day18 logging模块 sys shelve

    昨日回顾 re 正则表达式 匹配字符串 场景 例如:爬虫,密码规则验证,邮箱地址验证,手机号码 学习re主要学习的就是 那一堆特殊符号 hashlib hash是一种算法 lib表示库 该模块包含了一 ...

  6. ss源码学习--事件处理

    为了方便区分,以下分别使用local,server,remote代表ss客户端,ss服务端,以及ss客户端请求访问的远程主机. 在shadowsocks中,无论对于local还是server,都需要建 ...

  7. html中相对(relative),绝对(absolute)位置以及float的学习和使用案例 (转)

    这几天着手于CSS的研究,研究的原因主要是工作需要,最近发现如果做前端仅仅会javascript很难尽善尽美,当然懂样式和html在一定程度上可以让我们更近一步. css较为简单,由于个人擅长编写代码 ...

  8. php拓展

    https://github.com/phalcon/zephirhttp://blog.csdn.net/black_OX/article/details/43700707

  9. solo

    solo - 必应词典 美['soʊloʊ]英['səʊləʊ] n.[乐]独奏(曲):独唱(曲):单人舞:单独表演 adj.独唱[奏]的:单独的:单人的 v.独奏:放单飞 adv.独 网络梭罗:独奏 ...

  10. http://ctf.bugku.com/challenges#Timer(%E9%98%BF%E9%87%8CCTF):Bugku——Timer(阿里CTF)

      做了第一个android apk逆向题,很多工具啥的还没用过,再接再厉.   找到方法发现这个apk支持的SDK API是15-17,于是就下载了API 16并制作了模拟器,但发现还是运行不起来, ...