按照困难度升序排序
Kruskal重构树
这样一来一个点的子树中的所有困难值都小于改点的困难值
对于每次询问
倍增找出困难值最大且小于x的点
该点的子树中的第k大就是询问的答案
主席书维护区间k大

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring> using namespace std;
const int N = 1e5 + , M = 2e5 + ; int n, m, Q;
int A[N << ], high[N << ], val[N << ];
struct Node {
int u, v, hard;
} Edge[M * ];
struct Node_ {
int v, nxt;
} G[M * ];
int fa[N << ];
int Root[N << ];
int W[M * ];
int head[N << ];
int Lson[M * ], Rson[M * ];
int now;
int tree[N << ], bef[N << ], lst[N << ], rst[N << ], Tree;
int N_;
int f[N << ][];
int Ans;
int Segjs;
int impjs; #define gc getchar()
inline int read() {
int x = ; char c = gc;
while(c < '' || c > '') c = gc;
while(c >= '' && c <= '') x = x * + c - '', c = gc;
return x;
} inline bool Cmp(Node a, Node b) {
return a.hard < b.hard;
} int Get(int x) {
return fa[x] == x ? x : fa[x] = Get(fa[x]);
} inline void Add(int u, int v) {
G[++ now].v = v;
G[now].nxt = head[u];
head[u] = now;
} inline void Pre() {
for(int i = ; i <= ; i ++) for(int j = ; j <= n * - ; j ++) f[j][i] = f[f[j][i - ]][i - ];
} inline void Fill(int x, int y) {
Lson[x] = Lson[y], Rson[x] = Rson[y], W[x] = W[y];
} inline int Imp_find(int u, int x) {
for(int i = ; i >= ; i --) if(f[u][i] && val[f[u][i]] <= x) u = f[u][i];
return u;
} inline void Kruskal() {
sort(Edge + , Edge + m + , Cmp);
impjs = n;
for(int i = ; i <= n * ; i ++) fa[i] = i;
for(int i = ; i <= n * ; i ++) head[i] = -;
for(int i = ; i <= m; i ++) {
int fau = Get(Edge[i].u), fav = Get(Edge[i].v);
if(fau != fav) {
impjs ++;
val[impjs] = Edge[i].hard;
fa[fau] = fa[fav] = impjs;
Add(impjs, fau), Add(fau, impjs), Add(impjs, fav), Add(fav, impjs);
}
if(impjs == n * - ) break;
}
} void Dfs(int u, int fa) {
if(u <= n) {
lst[u] = rst[u] = ++ Tree;
bef[Tree] = u;
}
else lst[u] = n;
for(int i = head[u]; ~ i; i = G[i].nxt) {
int v = G[i].v;
if(v == fa) continue;
f[v][] = u;
Dfs(v, u);
rst[u] = max(rst[u], rst[v]), lst[u] = min(lst[u], lst[v]);
}
} void Insert(int &rt, int l, int r, int x) {
Fill(++ Segjs, rt);
rt = Segjs;
W[rt] ++;
if(l == r) return ;
int mid = (l + r) >> ;
if(x <= mid) Insert(Lson[rt], l, mid, x);
else Insert(Rson[rt], mid + , r, x);
} void Sec_A(int jd1, int jd2, int l, int r, int k) {
if(l == r) {Ans = l; return ;}
if(W[jd2] - W[jd1] < k) {Ans = -; return ;}
int mid = (l + r) >> ;
if(W[Rson[jd2]] - W[Rson[jd1]] >= k) Sec_A(Rson[jd1], Rson[jd2], mid + , r, k);
else Sec_A(Lson[jd1], Lson[jd2], l, mid, k - (W[Rson[jd2]] - W[Rson[jd1]]));
} int main() {
n = read(), m = read(), Q = read();
for(int i = ; i <= n; i ++)
A[i] = read(), high[i] = A[i];
for(int i = ; i <= m; i ++) {
int a = read(), b = read(), c = read();
Edge[i] = (Node) {a, b, c};
}
sort(A + , A + n + );
int a = unique(A + , A + n + ) - A - ;
for(int i = ; i <= n; i ++)
high[i] = lower_bound(A + , A + a + , high[i]) - A;
Kruskal();
Dfs(impjs, );
Pre();
for(int i = ; i <= n; i ++) {
Root[i] = Root[i - ];
Insert(Root[i], , n, high[bef[i]]);
}
for(; Q; Q --) {
int v = read(), x = read(), k = read();
if(Ans != -) v ^= Ans, x ^= Ans, k ^= Ans;
int use = Imp_find(v, x);
Sec_A(Root[lst[use] - ], Root[rst[use]], , n, k);
if(Ans != -) Ans = A[Ans];
printf("%d\n", Ans);
}
return ;
}

bzoj 3551的更多相关文章

  1. 【BZOJ 3545】【ONTAK 2010】Peaks & 【BZOJ 3551】【ONTAK 2010】Peaks加强版 Kruskal重构树

    sunshine的A题我竟然调了一周!!! 把循环dfs改成一个dfs就可以,,,我也不知道为什么这样就不会RE,但它却是A了,,, 这周我一直在调这个题,总结一下智障错误: 1.倍增的范围设成了n而 ...

  2. BZOJ 3551 Peaks加强版

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3551 题意:给出一个图,n个点,m条边.边有权值点也有权值.若干询问,(v,x,k),问从 ...

  3. BZOJ 3551: [ONTAK2010]Peaks加强版 [Kruskal重构树 dfs序 主席树]

    3551: [ONTAK2010]Peaks加强版 题意:带权图,多组询问与一个点通过边权\(\le lim\)的边连通的点中点权k大值,强制在线 PoPoQQQ大爷题解传送门 说一下感受: 容易发现 ...

  4. ●BZOJ 3551 [ONTAK2010]Peaks(在线)

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3551 题解: 最小生成树 Kruskal,主席树,在线 这个做法挺巧妙的...以Kruska ...

  5. BZOJ 3551/3545: [ONTAK2010]Peaks加强版 (Kruskal树+dfs序上的主席树+倍增)

    Orz PoPoQQQ 学到了维护子树信息的时候用dfsdfsdfs序套主席树节省线段树空间. 学到了怎么用指针写可持久化线段树-emmm- CODE 只贴上3551加强版带强制在线的代码 #incl ...

  6. bzoj 3551 [ONTAK2010]Peaks加强版(kruskal,主席树,dfs序)

    Description [题目描述]同3545 Input 第一行三个数N,M,Q. 第二行N个数,第i个数为h_i 接下来M行,每行3个数a b c,表示从a到b有一条困难值为c的双向路径. 接下来 ...

  7. bzoj 3551: [ONTAK2010]Peaks加强版

    Description [题目描述]同3545 Input 第一行三个数N,M,Q. 第二行N个数,第i个数为h_i 接下来M行,每行3个数a b c,表示从a到b有一条困难值为c的双向路径. 接下来 ...

  8. 【Peaks加强版 BZOJ 3551】你被坑了吗?

    这道在没加读入优化时间在20s左右的题终于在大米饼两天的死缠烂打.鬼混.乱整乱撞后艰难地AC了.但惋惜的是,大米饼一号代码其实更加简洁,但至今找不出BUG,我将它放在下面,也许有一天从远方来的另一个大 ...

  9. bzoj 3551 kruskal重构树dfs序上的主席树

    强制在线 kruskal重构树,每两点间的最大边权即为其lca的点权. 倍增找,dfs序对应区间搞主席树 #include<cstdio> #include<cstring> ...

  10. BZOJ.3551.[ONTAK2010]Peaks加强版(Kruskal重构树 主席树)

    题目链接 \(Description\) 有n个座山,其高度为hi.有m条带权双向边连接某些山.多次询问,每次询问从v出发 只经过边权<=x的边 所能到达的山中,第K高的是多少. 强制在线. \ ...

随机推荐

  1. SAS学习笔记34 指针控制

    指针控制符分为行指针和列指针两种 列指针控制符模式 @n:指明列的开始位置,是对应变量的数据开始列位置 列控制符号模式 n1-n2:n1列开始位置,n2列结束位置 @与@@符号应用 @行控制符号,控制 ...

  2. QMetaMethod 获取成员函数的元信息

    在上一篇中,我们将的是QMetaEnum类,它可以获得一个类中由Q_ENUM宏或Q_FLAG宏声明的枚举类型的元信息.同样,QMetaMethod类是用来获取成员方法的元信息的一个类.通过该类,我们可 ...

  3. atomikos 优化JDBC性能

    JDBC performance comes for free with our pooling DataSource classes: AtomikosDataSourceBean for XA-e ...

  4. JSON和XML格式与对象的序列化及反序列化的辅助类

    下面的代码主要是把对象序列化为JSON格式或XML格式等 using System; using System.Collections.Generic; using System.Globalizat ...

  5. C# 延迟初始化 Lazy<T>

    概念:延时初始化重点是延时,用时加载,意思是对象在使用的时候创建而不是在实例化的的时候才创建.   延时加载主要应用的场景: 数据层(ADO.NET或Entity Framework等ORM,Java ...

  6. Python考试_第三次

    - python 全栈11期月考题 一 基础知识:(70分) 1.文件操作有哪些模式?请简述各模式的作用(2分) 2.详细说明tuple.list.dict的用法,以及它们的特点(3分) 3.解释生成 ...

  7. my SO 链接opencv静态库一些FUCKing的笔记 opencv410 有毒

    1. 2. CMake "/work/lib/opencv/ubuntu14/4.1.0" make[2]: *** No rule to make target `/usr/lo ...

  8. Spring AOP编程经验总结

    编程范式概览:面向过程,面向对象,函数式编程,事件驱动编程,面向切面等, AOP是什么? Spring AOP是采用面向切面编程的编程范式,而非编程语言,它只能解决特定问题,而非所有问题,它与OOP不 ...

  9. VBA术语(三)

    在本章中,将介绍常用的Excel VBA术语.这些术语将在很多的模块中使用,因此理解其中的每一个术语都很重要. 模块 模块是编写代码的区域.如下图中,这是一个新的工作簿,因此没有任何模块. 要插入模块 ...

  10. input 默认提示文字 样式修改(颜色,大小,位置)

    input::-webkit-input-placeholder{ color:red; font-size:20px; ...... }