bzoj3545
线段树合并+离线+启发式合并
半年前这道题t成狗。。。
离线的做法比较好想,按照边的权值排序,询问的权值排序,然后枚举询问不断加边,加到上限后查找第k大值,这里平衡树,权值线段树都可以实现。
那么我们用权值线段树就行了, 并查集维护两点连通性,不连通的话就合并,并查集连接。
- #include<bits/stdc++.h>
- using namespace std;
- const int N = ;
- struct Query {
- int v, x, k, id;
- bool friend operator < (Query A, Query B)
- {
- return A.x < B.x;
- }
- } q[N];
- struct edge {
- int u, v, w;
- bool friend operator < (edge A, edge B)
- {
- return A.w < B.w;
- }
- } e[N];
- int n, m, Q;
- int root[N], h[N], ans[N];
- vector<int> vt;
- map<int, int> mp;
- inline int read()
- {
- int x = , f = ; char c = getchar();
- while(c < '' || c > '') { if(c == '-') f = -; c = getchar(); }
- while(c >= '' && c <= '') { x = x * + c - ''; c = getchar(); }
- return x * f;
- }
- namespace seg
- {
- int cnt;
- int lc[N << ], rc[N << ], size[N << ];
- void update(int l, int r, int &x, int pos)
- {
- x = ++cnt;
- ++size[x];
- if(l == r) return;
- int mid = (l + r) >> ;
- if(pos <= mid) update(l, mid, lc[x], pos);
- else update(mid + , r, rc[x], pos);
- }
- int merge(int x, int y)
- {
- if(!x) return y;
- if(!y) return x;
- size[x] += size[y];
- lc[x] = merge(lc[x], lc[y]);
- rc[x] = merge(rc[x], rc[y]);
- return x;
- }
- int query(int l, int r, int x, int rank)
- {
- if(l == r) return l;
- int mid = (l + r) >> ;
- if(size[rc[x]] >= rank) return query(mid + , r, rc[x], rank);
- else return query(l, mid, lc[x], rank - size[rc[x]]);
- }
- } using namespace seg;
- int main()
- {
- n = read();
- m = read();
- Q = read();
- for(int i = ; i <= n; ++i)
- {
- h[i] = read();
- vt.push_back(h[i]);
- }
- sort(vt.begin(), vt.end());
- vt.erase(unique(vt.begin(), vt.end()), vt.end());
- for(int i = ; i <= n; ++i)
- {
- h[i] = lower_bound(vt.begin(), vt.end(), h[i]) - vt.begin() + ;
- update(, n, root[i], h[i]);
- }
- for(int i = ; i <= m; ++i)
- {
- e[i].u = read();
- e[i].v = read();
- e[i].w = read();
- }
- sort(e + , e + m + );
- for(int i = ; i <= Q; ++i)
- {
- q[i].v = read();
- q[i].x = read();
- q[i].k = read();
- q[i].id = i;
- }
- sort(q + , q + Q + );
- int j = ;
- for(int i = ; i <= Q; ++i)
- {
- while(e[j].w <= q[i].x && j <= m)
- {
- if(root[e[j].u] != root[e[j].v]) root[e[j].u] = root[e[j].v] = merge(root[e[j].u], root[e[j].v]);
- ++j;
- }
- if(size[root[q[i].v]] < q[i].k) ans[q[i].id] = -;
- else ans[q[i].id] = query(, n, root[q[i].v], q[i].k);
- }
- for(int i = ; i <= Q; ++i) printf("%d\n", ans[i]);
- return ;
- }
bzoj3545的更多相关文章
- [您有新的未分配科技点][BZOJ3545&BZOJ3551]克鲁斯卡尔重构树
这次我们来搞一个很新奇的知识点:克鲁斯卡尔重构树.它也是一种图,是克鲁斯卡尔算法求最小生成树的升级版首先看下面一个问题:BZOJ3545 Peaks. 在Bytemountains有N座山峰,每座山峰 ...
- 【BZOJ3551】【BZOJ3545】 【ONTAK2010】 Peaks (kruskal重构树+主席树)
Description 在\(Bytemountains\)有\(~n~\)座山峰,每座山峰有他的高度\(~h_i~\). 有些山峰之间有双向道路相连,共\(~m~\)条路径,每条路径有一个困难值 ...
- BZOJ3545 [ONTAK2010]Peaks kruskal 并查集 主席树 dfs序
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3545 题意概括 Description 在Bytemountains有N座山峰,每座山峰有他的高度 ...
- bzoj3545: [ONTAK2010]Peaks 重构树 主席树
题目链接 bzoj3545: [ONTAK2010]Peaks 题解 套路重构树上主席树 代码 #include<cstdio> #include<algorithm> #de ...
- 【BZOJ3545】 [ONTAK2010]Peaks
BZOJ3545 [ONTAK2010]Peaks Solution 既然会加强版,直接把强制在线的操作去掉就好了. 代码实现 #include<stdio.h> #include< ...
- 【bzoj3545/bzoj3551】[ONTAK2010]Peaks/加强版 Kruskal+树上倍增+Dfs序+主席树
bzoj3545 题目描述 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询 ...
- bzoj3545 [ONTAK2010]Peaks、bzoj3551 [ONTAK2010]Peaks加强版
题目描述: bzoj3545,luogu bzoj3551 题解: 重构树+线段树合并. 可以算是板子了吧. 代码(非强制在线): #include<cstdio> #include< ...
- 【bzoj3545】[ONTAK2010]Peaks 线段树合并
[bzoj3545][ONTAK2010]Peaks 2014年8月26日3,1512 Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路 ...
- 「BZOJ3545」「ONTAK2010」Peaks
「BZOJ3545」「ONTAK2010」Peaks 题目传送门 题目大意: 给定一个 \(n\) 个点,\(m\) 条边的带点权边权无向图,有 \(q\) 次询问,每次询问从 \(v\) 点出发,经 ...
- bzoj3545/bzoj3551 [ONTAK2010]Peaks/Peaks加强版
bzoj3545/bzoj3551 [ONTAK2010]Peaks/Peaks加强版 传送门:bzoj bzoj wdnmd为什么加强版不是权限题原题却是啊 3545: [ONTAK2010]Pe ...
随机推荐
- ORACLE索引介绍和使用
1.什么是索引 索引是建立在表的一列或多个列上的辅助对象,目的是加快访问表中的数据: Oracle存储索引的数据结构是B*树,位图索引也是如此,只不过是叶子节点不同B*数索引: 索引由根节点.分支节点 ...
- linux shell学习笔记二---自定义函数(定义、返回值、变量作用域)介绍
linux shell 可以用户定义函数,然后在shell脚本中可以随便调用.下面说说它的定义方法,以及调用需要注意那些事项. 一.定义shell函数(define function) 语法: [ f ...
- Javascript 原型链与constructor
Javascript中的constructor与prototype 在学习javascript面向对象编程的过程中, constructor和prototype一直让我觉得理解不透,慢慢的学习过程中记 ...
- 移动端开发需要加的meta
移动端开发需要加的meta和常用的css3媒体查询样式,移动开发中头部要加的一些常用meta. <meta name="viewport" content="ini ...
- 手写redis的docker文件,通过docker-compose配置redis
在前面一遍随笔,配置的是mysql主从的docker-compose配置.今天我们来学习配置编排容器redis. 准备环境: docker 18.06.1-ce docker-compose 1.23 ...
- ubuntu jdk和tomcat配置
先查看linux的版通过file /sbin/init命令,下载对应版本的jdk. 我的ubuntu是64位的(桌面系统),所以下载的是jdk-7u71-linux-x64.tar.gz 在home的 ...
- loadrunner12 + ie11 无internet, 代码中文乱码
第一次用lr 录制的时候显示无internet, 在网上找了好久答案, 无非是ie路径设置,还有证书...... 都试过了不好用,自己研究一下午 , 最后发现是协议没对应上,http协议 ...
- CodeForcesGym 100753K Upside down primes
Upside down primes Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForc ...
- 【MongoDB】2、安装MongoDB 2.6.1 on Unbuntu 14.04(学习流水账)
http://blog.csdn.net/stationxp/article/details/26077439 计划: 装一个虚机,ubuntu吧,14.04 Trusty Tahr. 安装Mongo ...
- 【BZOJ3238】差异(后缀数组,单调栈)
题意: 思路:显然len(t[i])+len(t[j])这部分的和是一定的 那么问题就在于如何快速求出两两之间lcp之和 考虑将它们排名后用SA可以很方便的求出lcp,且对答案没有影响,因为形式都是数 ...