[ONTAK2010]Peaks kruskal重构树,主席树
[ONTAK2010]Peaks
kruskal重构树练手题。
LG传送门竟然不强制在线?看到离线水过很不爽:B站强制在线版传送门
看到“询问从点\(v\)开始只经过困难值小于等于\(x\)的路径”,马上想到kruskal重构树。先把重构树搞出来,可以先用类似NOI2018归程(题解)的方法处理,然后把叶子节点按dfs序放到序列上,重构树上每个点的子树的叶子节点在序列上是连续的,预处理出每个点的子树在序列上对应的左右端点,问题就变成了静态区间第\(k\)大,直接主席树。
#include <cstdio>
#include <cctype>
#include <algorithm>
#define R register
#define I inline
#define B 1000000
using namespace std;
const int N = 200003, M = 500003;
char buf[B], *p1, *p2;
I char gc() { return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, B, stdin), p1 == p2) ? EOF : *p1++; }
I int rd() {
    R int f = 0;
    R char c = gc();
    while (c < 48 || c > 57)
        c = gc();
    while (c > 47 && c < 58)
        f = f * 10 + (c ^ 48), c = gc();
    return f;
}
int a[N], b[N], f[N], rot[N], dep[N], fa[N][20], son[N][2], val[N], id[N], l[N], r[N], n, tim, T;
struct edge { int u, v, w; }g[M];
struct segtree { int p, q, s; }e[N << 5];
I int operator < (edge x, edge y) { return x.w < y.w; }
I int find(int x) {
    R int r = x, y;
    while (f[r] ^ r)
        r = f[r];
    while (x ^ r)
        y = f[x], f[x] = r, x = y;
    return r;
}
void dfs(int x) {
    dep[x] = dep[fa[x][0]] + 1;
    for (R int i = 1; i < 20; ++i)
        fa[x][i] = fa[fa[x][i - 1]][i - 1];
    if (x <= n) {
        id[++tim] = x, l[x] = r[x] = tim;
        return ;
    }
    dfs(son[x][0]), dfs(son[x][1]), l[x] = l[son[x][0]], r[x] = r[son[x][1]];
}
void build(int &k, int l, int r) {
    k = ++T;
    if (l == r)
        return ;
    R int m = l + r >> 1;
    build(e[k].p, l, m), build(e[k].q, m + 1, r);
}
int modify(int k, int l, int r, int x) {
    R int t = ++T;
    e[t].p = e[k].p, e[t].q = e[k].q, e[t].s = e[k].s + 1;
    if (l == r)
        return t;
    R int m = l + r >> 1;
    if (x <= m)
        e[t].p = modify(e[k].p, l, m, x);
    else
        e[t].q = modify(e[k].q, m + 1, r, x);
    return t;
}
int query(int k, int t, int l, int r, int x) {
    if (l == r)
        return x <= e[t].s - e[k].s ? l : -1;
    R int m = l + r >> 1, y = e[e[t].q].s - e[e[k].q].s;
    if (x > y)
        return query(e[k].p, e[t].p, l, m, x - y);
    else
        return query(e[k].q, e[t].q, m + 1, r, x);
}
int main() {
    R int S, m, Q, i, x, y, z, cnt;
    cnt = n = rd(), m = rd(), Q = rd();
    for (i = 1; i <= n; ++i)
        f[i] = i, a[i] = b[i] = rd();
    sort(b + 1, b + n + 1), S = unique(b + 1, b + n + 1) - b - 1, build(rot[0], 1, S);
    for (i = 1; i <= m; ++i)
        g[i] = (edge){rd(), rd(), rd()};
    sort(g + 1, g + m + 1);
    for (i = 1; i <= m; ++i) {
        x = find(g[i].u), y = find(g[i].v);
        if (x ^ y) {
            val[++cnt] = g[i].w, f[cnt] = f[x] = f[y] = cnt;
            son[cnt][0] = x, son[cnt][1] = y, fa[x][0] = fa[y][0] = cnt;
        }
    }
    dfs(cnt);
    for (i = 1; i <= n; ++i)
        rot[i] = modify(rot[i - 1], 1, S, lower_bound(b + 1, b + S + 1, a[id[i]]) - b);
    while (Q--) {
        x = rd(), y = rd(), z = rd();
        for (i = 19; ~i; --i)
            if (dep[x] - (1 << i) > 0 && val[fa[x][i]] <= y)
                x = fa[x][i];
        z = query(rot[l[x] - 1], rot[r[x]], 1, S, z);
        printf("%d\n", ~z ? b[z] : -1);
    }
    return 0;
}
[ONTAK2010]Peaks kruskal重构树,主席树的更多相关文章
- BZOJ3545&3551[ONTAK2010]Peaks——kruskal重构树+主席树+dfs序+树上倍增
		题目描述 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只 ... 
- luogu4197 Peaks (kruskal重构树+主席树)
		按照边权排序建出kruskal重构树,每次就变成了先找一个权值<=x的最远的祖先,然后看这个子树的第k小.离散化一下,在dfs序上做主席树即可 而且只需要建叶节点的主席树 注意输出的是第k小点的 ... 
- 洛谷P4197 Peaks(Kruskal重构树 主席树)
		题意 题目链接 往后中文题就不翻译了qwq Sol 又是码农题..出题人这是强行把Kruskal重构树和主席树拼一块了啊.. 首先由于给出的限制条件是<=x,因此我们在最小生成树上走一定是最优的 ... 
- 【BZOJ3545】Peaks(Kruskal重构树 主席树)
		题目链接 大意 给出有\(N\)个点\(M\)条边的一张图,其中每个点都有一个High值,每条边都有一个Hard值. 再给出\(Q\)个询问:\(v\) \(x\) \(k\) 每次询问查询从点\(v ... 
- 【BZOJ3551】【BZOJ3545】 【ONTAK2010】 Peaks (kruskal重构树+主席树)
		Description  在\(Bytemountains\)有\(~n~\)座山峰,每座山峰有他的高度\(~h_i~\). 有些山峰之间有双向道路相连,共\(~m~\)条路径,每条路径有一个困难值 ... 
- luoguP4197:Peaks(Kruskal重构树+主席树)或者(点分树+离线)
		题意:有N座山,M条道路.山有山高,路有困难值(即点权和边权).现在Q次询问,每次给出(v,p),让求从v出发,只能结果边权<=p的边,问能够到达的山中,第K高的高度(从大到小排序). 思路:显 ... 
- [BZOJ3551][ONTAK2010]Peaks(加强版)(Kruskal重构树,主席树)
		3551: [ONTAK2010]Peaks加强版 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2438 Solved: 763[Submit][ ... 
- 【BZOJ-3545&3551】Peaks&加强版     Kruskal重构树 + 主席树 + DFS序 + 倍增
		3545: [ONTAK2010]Peaks Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1202 Solved: 321[Submit][Sta ... 
- [luogu P4197] Peaks 解题报告(在线:kruskal重构树+主席树 离线:主席树+线段树合并)
		题目链接: https://www.luogu.org/problemnew/show/P4197 题目: 在Bytemountains有N座山峰,每座山峰有他的高度$h_i$.有些山峰之间有双向道路 ... 
随机推荐
- iOS开发中常用的数学函数
			iOS开发中常用的数学函数 /*---- 常用数学公式 ----*/ //指数运算 3^2 3^3 NSLog(,)); //result 9 NSLog(,)); //result 27 //开平方 ... 
- php5 Array  数组函数
			函数 描述 array() 创建数组. array_change_key_case() 把数组中所有键更改为小写或大写. array_chunk() 把一个数组分割为新的数组块. array_colu ... 
- zabbix 监控wind登录状态
			参考博文:http://blog.51cto.com/qicheng0211/1694583 需求:监控win 2008 的用户登录状态,无论用户登录成功与否都要告警(也可以刷选指定用户.指定时间内) ... 
- windows 2012R2 上必须要用sharepoint 2013 sp1.
			已经确认. 虽然有人讲以下powershell可以帮助安装sharepoint 2013. 不过不是每次都可以的 Import-Module ServerManager Add-WindowsFeat ... 
- debug的粗略使用(求大神们补充、指教,小渣马上改)
			debug的使用 往往我们在写代码的时候会发现那种很隐秘的bug,一直找找不多,甚至开始怀疑人生.目光扫描和人脑编译又耗时又耗精力又很容易中途乱了脑子,一切得重新来,所以我写了一篇博客来模拟一下检查b ... 
- [T-ARA][For you]
			歌词来源:http://music.163.com/#/song?id=33682511 作曲 : Monster Factory [作曲 : Monster Factory] 作词 : Monste ... 
- BZOJ 2424 订货 最小费用流
			题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2424 题目大意: 某公司估计市场在第i个月对某产品的需求量为Ui,已知在第i月该产品的 ... 
- 函数的类型:函数也是类型 (*)->*
			函数的类型:函数也是类型 (*)->* 函数类型作为类型可以定义变量,使得函数变量具有可替代性,这个是高阶函数的编程基础. 使用函数的类型可以定义函数的变量,并用函数给这个变量赋值: 每一个函数 ... 
- pthread线程内存布局
			http://www.cnblogs.com/snake-hand/p/3148191.html 我们从图上可以看出,两个线程之间的栈是独立的,其他是共享的,所以,在操作共享区域的时候才有可能出现同步 ... 
- Spring-IOC BeanFactory运行时动态注册bean
			在spring运行时,动态的添加bean,dapeng框架在解析xml的字段时,使用到了动态注册,注册了一个实现了FactoryBean类! 定义一个没有被Spring管理的Controller pu ... 
