题目链接

bzoj3545: [ONTAK2010]Peaks

题解

套路重构树上主席树

代码

#include<cstdio>
#include<algorithm>
#define gc getchar
#define pc putchar
inline int read() {
int x = 0,f = 1;
char c = getchar();
while(c < '0' || c > '9') { if(c == '-')f = -1; c = gc(); }
while(c <= '9' && c >= '0') x = x * 10 + c - '0',c = gc();
return x * f;
}
void print(int x) {
if(x < 0) {
pc('-');
x = -x;
}
if(x >= 10) print(x / 10);
pc(x % 10 + '0');
}
int n,m,q;
const int maxn = 500007;
int h[maxn];
struct node {
int u,v,w,next;
} e[maxn],edge[maxn];
int num = 0,head[maxn];
inline void add_edge(int u,int v) {
edge[++ num].v = v; edge[num].next = head[u],head[u] = num;
}
inline bool cmp(node a,node b) {
return a.w < b.w;
}
int fa[maxn];
int dad[maxn][23],mn[maxn];
int tot = 0;
int L[maxn],R[maxn];
int rt[maxn];
int lin[maxn],cnt = 0;
void dfs(int x) {
L[x] = 0x3f3f3f3f;
R[x] = 0;
if(!head[x]) {
lin[++ cnt] = x;
L[x] = R[x] = cnt;
return;
}
for(int i = head[x];i ;i = edge[i].next) {
int v = edge[i].v;
dfs(v);
L[x] = std::min(L[v],L[x]);
R[x] = std::max(R[v],R[x]);
}
} int b[maxn];
int sum = 0;
struct Cmt {
int ls[100000 * 20],rs[100000 * 20],siz[100000 * 20];
void insert(int px,int &x,int l,int r,int k) {
x = ++ sum;
siz[x] = siz[px] + 1;
if(l == r) return;
ls[x] = ls[px], rs[x] = rs[px];
int mid = l + r >> 1;
if(k <= mid) insert(ls[px],ls[x],l,mid,k);
else insert(rs[px],rs[x],mid + 1,r,k);
}
int query(int lx,int rx,int l,int r,int k) {
if(l == r) return l;
int mid = l + r >> 1, tmp = siz[rs[rx]] - siz[rs[lx]];
if(tmp >= k) return query(rs[lx],rs[rx],mid + 1,r,k);
else return query(ls[lx],ls[rx],l,mid,k - tmp);
}
} t;
int get(int x,int val) {
for(int i = 20;i >= 0;-- i)
if(mn[dad[x][i]] <= val)
x = dad[x][i];
return x;
}
int find(int x) {
if(fa[x] != x) fa[x] = find(fa[x]);
return fa[x];
}
int main() {
mn[0] = 0x3f3f3f3f;
n = read(); m = read(); q = read();
for(int i = 1;i <= n;++ i) b[i] = h[i] = read();
std::sort(b + 1,b + n + 1);
int len = std::unique(b + 1,b + n + 1) - b - 1; for(int i = 1;i <= n;++ i) h[i] = std::lower_bound(b + 1,b + len + 1,h[i]) - b; for(int i = 1;i <= m;++ i)
e[i].u = read(),e[i].v = read(),e[i].w = read();
tot = n;
for(int i = 1;i <= n;++ i) fa[i] = i;
std::sort(e + 1,e + m + 1,cmp);
int nnn = 0;
for(int i = 1;i <= m;++ i) {
int u = e[i].u,v = e[i].v;
int fu = find(u),fv = find(v);
if(fu != fv) {
++ tot;
dad[fu][0] = tot;
dad[fv][0] = tot;
add_edge(tot,fu);
add_edge(tot,fv);
fa[fu] = tot;
fa[fv] = tot;
fa[tot] = tot;
mn[tot] = e[i].w;
nnn ++;
}
if(nnn == n - 1) break;
}
for(int i = 1;i <= 20;++ i)
for(int j = 1;j <= tot; ++ j)
dad[j][i] = dad[dad[j][i - 1]][i - 1];
//print(dad[15][0]);
dfs(tot);
for(int i = 1;i <= cnt;++ i)
t.insert(rt[i - 1],rt[i],1,len,h[lin[i]]);
for(int i = 1;i <= q;++ i) {
int v = read(),x = read(),k = read();
int p = v;
v = get(v,x);
if(R[v] - L[v] + 1 < k) puts("-1");
else print(b[t.query(rt[L[v] - 1],rt[R[v]],1,len,k)]),pc('\n');
}
return 0;
}
/* */

bzoj3545: [ONTAK2010]Peaks 重构树 主席树的更多相关文章

  1. luoguP4197:Peaks(Kruskal重构树+主席树)或者(点分树+离线)

    题意:有N座山,M条道路.山有山高,路有困难值(即点权和边权).现在Q次询问,每次给出(v,p),让求从v出发,只能结果边权<=p的边,问能够到达的山中,第K高的高度(从大到小排序). 思路:显 ...

  2. BZOJ3545&3551[ONTAK2010]Peaks——kruskal重构树+主席树+dfs序+树上倍增

    题目描述 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只 ...

  3. 【BZOJ3551】【BZOJ3545】 【ONTAK2010】 Peaks (kruskal重构树+主席树)

    Description ​ 在\(Bytemountains\)有\(~n~\)座山峰,每座山峰有他的高度\(~h_i~\). 有些山峰之间有双向道路相连,共\(~m~\)条路径,每条路径有一个困难值 ...

  4. 【BZOJ-3545&3551】Peaks&加强版 Kruskal重构树 + 主席树 + DFS序 + 倍增

    3545: [ONTAK2010]Peaks Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1202  Solved: 321[Submit][Sta ...

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

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

  6. 【BZOJ3545】Peaks(Kruskal重构树 主席树)

    题目链接 大意 给出有\(N\)个点\(M\)条边的一张图,其中每个点都有一个High值,每条边都有一个Hard值. 再给出\(Q\)个询问:\(v\) \(x\) \(k\) 每次询问查询从点\(v ...

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

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

  8. luogu4197 Peaks (kruskal重构树+主席树)

    按照边权排序建出kruskal重构树,每次就变成了先找一个权值<=x的最远的祖先,然后看这个子树的第k小.离散化一下,在dfs序上做主席树即可 而且只需要建叶节点的主席树 注意输出的是第k小点的 ...

  9. 洛谷P4197 Peaks&&克鲁斯卡尔重构树学习笔记(克鲁斯卡尔重构树+主席树)

    传送门 据说离线做法是主席树上树+启发式合并(然而我并不会) 据说bzoj上有强制在线版本只能用克鲁斯卡尔重构树,那就好好讲一下好了 这里先感谢LadyLex大佬的博客->这里 克鲁斯卡尔重构树 ...

随机推荐

  1. ubuntu 禁用 nouveau 方法

    (1)直接移除这个驱动(备份出来) $ mv /lib/modules/4.4.0-31-generic/kernel/drivers/gpu/drm/nouveau/nouveau.ko /lib/ ...

  2. SpringMVC使用Burlap发布远程服务

    参考这篇文章https://www.cnblogs.com/fanqisoft/p/10283156.html 将提供者配置类中的 @Bean public HessianServiceExporte ...

  3. 【API】开机自启动- ActiveX启动

    一 学习目标 这是一段远程控制木马开机启动的代码,主要使用了ActiveX方式启动.结合自己的理解重新整理了笔记.而作为编程新手入门的自己决定要开始梳理学习目的和订下学习的目标.从今天开始要坚持做到 ...

  4. ubuntu 删除自带软件的方法

    $ sudo dpkg -l | grep -i "need2del" $ sudo dpkg -P 或者: $ sudo apt-get --purge remove need2 ...

  5. 研究slatstack时踩过的坑,注意点及解决方案

    运行问题 1.直接物理性移除minion或者更换minion原先连接的master,会导致先前的master始终无法ping通minion [root@localhost salt]# salt '* ...

  6. 【实践】Matlab2016a的mdce集群搭建

    Matlab R2016a的mdce集群搭建 1.解压文件Matlab_R2016b_win64.iso. 文件下载地址:链接:https://pan.baidu.com/s/1mjJOaHa 密码: ...

  7. win32编程:L,_T() ,TEXT和_TEXT

    L的使用: 在字符串前面的大写字母L,用来告诉编译器该字符串应该作为Unicode来编译.它用来将ASNI转换为Unicode,Unicode字符串中每个字符占16位(两个字节),而在ASNI中每个字 ...

  8. Jenkins实现定时、顺序编译

    1      Jenkins实现定时.顺序编译 l  Jenkins 编译流程:更新代码,编译公共服务,编译普通服务(普通服务依赖于公共服务).以下图为例,首先执行 update,再执行 icto_c ...

  9. centos7.2环境下安装smokeping对网络状态进行监控

    centos7.2环境下安装smokeping对网络状态进行监控 安装smokeping建议用centos7,用centos6.5一直卡在smokeping那里,下载不了perl的扩展插件,可能是因为 ...

  10. linux下ssh远程连接工具SecureCRT和xshell编码设置

    默认的编码有时候显示乱码,需要切换到utf-8 xshell的设置 多个会话窗口执行同样命令 中文界面: