[ONTAK2010] Peaks 加强版

题目大意:原题变为强制在线查询

Solution

  1. 读入山高,排序后依然建立树链,初始化并查集,初始化重构树新节点标号为\(n+1\)
  2. 读入边,按照边权从小到大排序
  3. \(kruskal\)重构树
    • 如果是在同一并查集里,\(continue\)
    • 如果不在,建立新节点,两个节点的\(a\)都是新节点,并且记录在重构树上的\(fa\),合并树链
  4. 倍增处理重构树
  5. 读入询问,如果上一次询问的答案不为\(-1\),\(xor\)上一次的答案,在重构树上跳,查询答案

Code

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define pf(x) printf("%d\n", x);
using std::sort; const int X = 3400000 + 5;
const int M = 5e5 + 5;
const int N = 1e5 + 10; int n, m, q, node, cnt, lastans = 0;
int sum[X], lson[X], rson[X], kfa[N << 1], ju[N << 1][18], val[N], fa[N << 1], root[N << 1]; struct Hill{
int id, hi;
bool operator < (const Hill &cmp) const {
return hi < cmp.hi;
}
}h[N]; struct Aha{
int a, b, c;
bool operator < (const Aha &cmp) const {
return c < cmp.c;
}
}a[M]; int find(int x){
return x == fa[x] ? x : fa[x] = find(fa[x]);
} void insert(int &cur, int l, int r, int p){
if(!cur) cur = ++cnt;
sum[cur]++;
if(l == r) return;
int mid = l + ((r - l) >> 1);
if(p <= mid) insert(lson[cur], l, mid, p);
else insert(rson[cur], mid + 1, r, p);
} void merge(int &cur, int x, int y, int l, int r){
if(!cur) cur = ++cnt;
sum[cur] = sum[x] + sum[y];
if(l == r) return;
int mid = l + ((r - l) >> 1);
if(lson[x] && lson[y]) merge(lson[cur], lson[x], lson[y], l, mid);
else if(lson[x]) lson[cur] = lson[x];
else if(lson[y]) lson[cur] = lson[y];
if(rson[x] && rson[y]) merge(rson[cur], rson[x], rson[y], mid + 1, r);//1, mid
else if(rson[x]) rson[cur] = rson[x];
else if(rson[y]) rson[cur] = rson[y];
} int query(int cur, int l, int r, int p){
if(l == r){
return h[l].hi;//
}
int mid = l + ((r - l) >> 1);
if(p <= sum[lson[cur]]) return query(lson[cur], l, mid, p);
else return query(rson[cur], mid + 1, r, p - sum[lson[cur]]); } inline int jump(int &x, int y){
for(int i = 17; i >= 0; --i)
if(ju[x][i] && val[ju[x][i] - n] <= y){
x = ju[x][i];
}
return x;
} int main(){
scanf("%d %d %d", &n, &m, &q);
for(int i = 1; i <= n; ++i)
scanf("%d", &h[i].hi), h[i].id = i, fa[i] = i;
sort(h + 1, h + n + 1);
for(int i = 1; i <= n; ++i)
insert(root[h[i].id], 1, n, i);
node = n;
for(int i = 1; i <= m; ++i)
scanf("%d %d %d", &a[i].a, &a[i].b, &a[i].c);
sort(a + 1, a + 1 + m);
for(int i = 1, fx, fy; i <= m; ++i){
fx = find(a[i].a);
fy = find(a[i].b);
if(fx == fy) continue;
fa[++node] = fa[fx] = fa[fy] = kfa[fx] = kfa[fy] = node;
val[node - n] = a[i].c;
merge(root[node], root[fx], root[fy], 1, n);
}
for(int i = 1; i <= node; ++i) ju[i][0] = kfa[i];
for(int j = 1; j <= 17; ++j)
for(int i = 1; i <= node; ++i)// i <= n 以及顺序
ju[i][j] = ju[ju[i][j - 1]][j - 1];
int la, lb, lc;
while(q--){
scanf("%d %d %d", &la, &lb, &lc);
if(lastans != -1) la ^= lastans, lb ^= lastans, lc ^= lastans;
int u = jump(la, lb);
if(sum[root[u]] < lc) lastans = -1;
else lastans = query(root[u], 1, n, sum[root[u]] - lc + 1);
printf("%d\n", lastans);
}
return 0;
}

[ONTAK2010] Peaks 加强版的更多相关文章

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

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

  2. 【BZOJ3551】 [ONTAK2010]Peaks加强版

    BZOJ3551 [ONTAK2010]Peaks加强版 Solution Kruscal重构树后发现可以对于小于的离散化然后倍增+主席树找到上一个的可行解. 然后就可以了. 如果数组开的不好,容易在 ...

  3. 【BZOJ3551】[ONTAK2010]Peaks加强版 最小生成树+DFS序+主席树

    [BZOJ3545][ONTAK2010]Peaks Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困 ...

  4. 3551: [ONTAK2010]Peaks加强版

    3551: [ONTAK2010]Peaks加强版 https://www.lydsy.com/JudgeOnline/problem.php?id=3551 分析: kruskal重构树 +  倍增 ...

  5. [BZOJ3551][ONTAK2010]Peaks(加强版)(Kruskal重构树,主席树)

    3551: [ONTAK2010]Peaks加强版 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2438  Solved: 763[Submit][ ...

  6. bzoj 3545&&3551: [ONTAK2010]Peaks &&加强版 平衡树&&并查集合并树&&主席树

    3545: [ONTAK2010]Peaks Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 635  Solved: 177[Submit][Stat ...

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

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

  8. ONTAK2010 Peaks加强版(离线&在线)

    题面 弱化版:luogu 强制在线版:bzoj 题解 本题有两种解法 离线算法:线段树合并 先看一道简单题[USACO18JAN]MooTube 本题就是在此基础上求第\(k\)高的点 首先把询问和路 ...

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

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

随机推荐

  1. MySQL 字符集及校验规则

    字符集 Mysql 的字符集有4个级别的默认设置:服务器级,数据库级,表级和字段级,客户端交互时,也可以指定字符集 # 字符集:是一个系统支持的所有抽象字符的集合.字符是各种文字和符号的总称,包括各国 ...

  2. 缓冲区溢出实验 6 exit(0)

    实验环境.代码.及准备 https://www.cnblogs.com/lqerio/p/12870834.html vul6 Vul6和vul2类似,可以覆盖foo的ebp的一字节.而这里有一个ex ...

  3. QXDM和QCAT软件使用指南

    一.传送门 链接:https://pan.baidu.com/s/1i55YXnf 密码:v6nw 二.QXDM,QPST和QCAT的简单说明 QXDM,QPST和QCAT是Qualcomm高通公司针 ...

  4. 关于FFT的一些理解,以及如何手工计算FFT加深理解和验证正确性

    总结缺少逻辑性和系统性,主要便于自己理解和记忆 关于一维FFT的 于是复系数Cn是图像傅里叶变换的yn列向量 于是我们看到最后引入,Cn这个复系数的模来表征频率波的振幅记为Sn(即简谐波叠加的数量 然 ...

  5. 统计学三大相关性系数:pearson,spearman,kendall

    目录 person correlation coefficient(皮尔森相关性系数-r) spearman correlation coefficient(斯皮尔曼相关性系数-p) kendall ...

  6. 基于vue3.0+electron新开窗口|Electron多开窗体|父子模态窗口

    最近一直在折腾Vue3+Electron技术结合的实践,今天就来分享一些vue3.x和electron实现开启多窗口功能. 开始本文之前,先来介绍下如何使用vue3和electron来快速搭建项目. ...

  7. IE & 自定义滚动条 & scroll

    IE & 自定义滚动条 & scroll 请问这种在 IE 下的自定义滚动条,是如何实现的? https://fairyever.gitee.io/d2-admin-preview/# ...

  8. Swift private(set) All In One

    Swift private(set) All In One SwiftUI Getters and Setters https://docs.swift.org/swift-book/Language ...

  9. 微软 AI 公开课

    微软 AI 公开课 https://github.com/microsoft/ai-edu https://school.azure.cn/ https://docs.microsoft.com/le ...

  10. input change only trigger once bug

    input change only trigger once bug clear first https://stackoverflow.com/a/11280934/5934465 upload E ...