bzoj3545: [ONTAK2010]Peaks
Description
在Bytemountains有N座山峰,每座山峰有他的高度h_i。有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只经过困难值小于等于x的路径所能到达的山峰中第k高的山峰,如果无解输出-1。
Input
第一行三个数N,M,Q。
第二行N个数,第i个数为h_i
接下来M行,每行3个数a b c,表示从a到b有一条困难值为c的双向路径。
接下来Q行,每行三个数v x k,表示一组询问。
Output
对于每组询问,输出一个整数表示答案。
考虑离线,将边和询问按边权排序,从小到大加入边,平衡树启发式合并维护连通块内点权
- #include<cstdio>
- #include<algorithm>
- #include<cstdlib>
- const int M=;
- char buf[M+],*ptr=buf-;
- inline int _int(){
- int x=,c=*++ptr,f=;
- while(c>||c<){if(c=='-')f=-;c=*++ptr;}
- while(c>&&c<)x=x*+c-,c=*++ptr;
- return x;
- }
- struct edge{
- int s,t,l;
- }e[];
- bool operator<(const edge&a,const edge&b){
- return a.l<b.l;
- }
- struct Q{
- int w,mx,k,id;
- }qs[];
- bool operator<(const Q&a,const Q&b){
- return a.mx<b.mx;
- }
- const int N=;
- int n,m,q;
- int h[N],ans[];
- int ch[N][],sz[N],col[N],rt[N],rnd[N];
- int stk[N],stp;
- void dfs(int w){
- if(!w)return;
- dfs(ch[w][]);
- stk[stp++]=w;
- dfs(ch[w][]);
- }
- inline void up(int w){
- sz[w]=+sz[ch[w][]]+sz[ch[w][]];
- }
- inline void rot(int&w,int d){
- int u=ch[w][d];
- ch[w][d]=ch[u][d^];
- ch[u][d^]=w;
- up(w);
- up(w=u);
- }
- void ins(int&w,int x){
- if(!w){
- w=x;
- return;
- }
- ++sz[w];
- int d=(h[w]<h[x]);
- ins(ch[w][d],x);
- if(rnd[ch[w][d]]>rnd[w])rot(w,d);
- }
- int kmax(int w,int k){
- if(sz[w]<k||k<=)return -;
- --k;
- while(){
- int s=sz[ch[w][]];
- if(s==k)return h[w];
- if(s<k){
- k-=s+;
- w=ch[w][];
- }else{
- w=ch[w][];
- }
- }
- }
- void merge(int x,int y){
- x=col[x];y=col[y];
- if(x==y)return;
- if(sz[rt[x]]<sz[rt[y]]){int z=x;x=y;y=z;}
- stp=;
- dfs(rt[y]);
- for(int i=;i<stp;i++){
- int w=stk[i];
- col[w]=x;
- sz[w]=;
- ch[w][]=ch[w][]=;
- ins(rt[x],w);
- }
- }
- int main(){
- fread(buf,,M,stdin);
- srand();
- n=_int();m=_int();q=_int();
- for(int i=;i<=n;i++){
- h[i]=_int();
- sz[rt[i]=col[i]=i]=;
- rnd[i]=rand();
- }
- for(int i=;i<m;i++){
- e[i].s=_int();
- e[i].t=_int();
- e[i].l=_int();
- }
- std::sort(e,e+m);
- e[m].l=;
- for(int i=;i<q;i++){
- qs[i].w=_int();
- qs[i].mx=_int();
- qs[i].k=_int();
- qs[i].id=i;
- }
- std::sort(qs,qs+q);
- for(int i=,p=;i<q;i++){
- int mx=qs[i].mx;
- while(e[p].l<=mx){
- merge(e[p].s,e[p].t);
- ++p;
- }
- ans[qs[i].id]=kmax(rt[col[qs[i].w]],qs[i].k);
- }
- for(int i=;i<q;i++)printf("%d\n",ans[i]);
- return ;
- }
bzoj3545: [ONTAK2010]Peaks的更多相关文章
- bzoj3545: [ONTAK2010]Peaks 重构树 主席树
题目链接 bzoj3545: [ONTAK2010]Peaks 题解 套路重构树上主席树 代码 #include<cstdio> #include<algorithm> #de ...
- BZOJ3545 [ONTAK2010]Peaks kruskal 并查集 主席树 dfs序
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3545 题意概括 Description 在Bytemountains有N座山峰,每座山峰有他的高度 ...
- bzoj3545 [ONTAK2010]Peaks、bzoj3551 [ONTAK2010]Peaks加强版
题目描述: bzoj3545,luogu bzoj3551 题解: 重构树+线段树合并. 可以算是板子了吧. 代码(非强制在线): #include<cstdio> #include< ...
- 【线段树合并】bzoj3545: [ONTAK2010]Peaks
1A还行 Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问, ...
- [BZOJ3545] [ONTAK2010]Peaks(线段树合并 + 离散化)
传送门 由于困难值小于等于x这个很恶心,可以离线处理,将边权,和询问时的x排序. 每到一个询问的时候,将边权小于等于x的都合并起来再询问. .. 有重复元素的线段树合并的时间复杂度是nlog^2n # ...
- 【BZOJ3545】 [ONTAK2010]Peaks
BZOJ3545 [ONTAK2010]Peaks Solution 既然会加强版,直接把强制在线的操作去掉就好了. 代码实现 #include<stdio.h> #include< ...
- 【bzoj3545】[ONTAK2010]Peaks 线段树合并
[bzoj3545][ONTAK2010]Peaks 2014年8月26日3,1512 Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路 ...
- bzoj3545/bzoj3551 [ONTAK2010]Peaks/Peaks加强版
bzoj3545/bzoj3551 [ONTAK2010]Peaks/Peaks加强版 传送门:bzoj bzoj wdnmd为什么加强版不是权限题原题却是啊 3545: [ONTAK2010]Pe ...
- 【BZOJ3551】[ONTAK2010]Peaks加强版 最小生成树+DFS序+主席树
[BZOJ3545][ONTAK2010]Peaks Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困 ...
随机推荐
- java 中获取文件路径
方案一: 文件目录如下: 配置文件:firehosetos3sample.properties在src目录下面第一层,与包是一层的 在Getpath_ClassLoader.java类中: Syste ...
- java 的复用工具 - jar包
前言 Java提供了jar包的机制,使得已经开发好了的类能够顺利的被将来的工程所复用. 本章主要讲解如何使用这种工具. 包的作用 包能够将不同功用的类组织起来,从而确保类名的唯一性. 为了保证包名的唯 ...
- ion torrent ion proton
https://www.youtube.com/watch?v=6Is3W7JkFp8 NGS 的视频 说的不错 一个做癌症的教授讲的 Ion Torrent™ next-generation seq ...
- Highcharts ajax获取json对象动态生成报表生成 .
http://blog.csdn.net/wsk7860/article/details/8751061 最近做个项目,项目经理想做一个统计报表,在网上查看些资料就选用Highchars 这里和大家分 ...
- sql server中NULL导入decimal字段时报错
sql server中NULL导入decimal字段时报错 在导入CSV文件时,如果decimal字段为null值,导致文本文件入库时失败. 错误现象 构造例子 新建一张表,包含decimal字段. ...
- IIS 7.0 下 httpMoudle 失效的问题
在web.config里配置了: <system.web> <httpModules> <add type="DevExpress.Web.ASPxClass ...
- PHP新手入门1——表单
注:本身是Android,Android之前是java.但公司后台PHP特别多.就好奇php后台是怎么通过一个url给我数据的(完全不懂php).于是就学呗.学习系列随笔第一人称是一个Android小 ...
- Java字段初始化的规律
class InitializeBookClass { { field=200; } public int field=100; public InitializeBookClass(int valu ...
- Redis是什么?Redis数据库全解?
Redis是什么 这个问题的结果影响了我们怎么用Redis.如果你认为Redis是一个key value store, 那可能会用它来代替MySQL;如果认为它是一个可以持久化的cache, 可能只是 ...
- hadoop常用管理员命令
hadoop job -list 列出正在运行的job hadoop job -kill kill掉job hadoop fsck 检查HDFS坏快 hadoop dfsadmin -report检查 ...