bzoj3545 Peaks 线段树合并
离线乱搞。。。
也就是一个线段树合并没什么
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int n,m,q,tot,cnt,num,h[100001],a[100001],ans[500001],fa[100001],root[100001];
struct edge{
int u,v,cost;
bool operator < (const edge &b) const{
return cost<b.cost;
}
}e[500001];
struct Que{
int id,v,x,k;
bool operator < (const Que &b) const{
return x<b.x;
}
}que[500001];
struct node{
int lch,rch,siz;
}tree[2000001];
int find(int x){
if(fa[x]==x)return x;
return fa[x]=find(fa[x]);
}
void insert(int o,int l,int r,int x){
tree[o].siz++;
if(l==r)return;
int mid=(l+r)>>1;
if(x<=mid){
if(!tree[o].lch)tree[o].lch=++num;
insert(tree[o].lch,l,mid,x);
}
if(x>mid){
if(!tree[o].rch)tree[o].rch=++num;
insert(tree[o].rch,mid+1,r,x);
}
}
int query(int o,int l,int r,int k){
if(k<=0 or k>tree[o].siz)return -1;
if(l==r)return l;
int mid=(l+r)>>1;
if(k<=tree[tree[o].lch].siz)return query(tree[o].lch,l,mid,k);
return query(tree[o].rch,mid+1,r,k-tree[tree[o].lch].siz);
}
int merge(int x,int y){
if(!x or !y)return x+y;
tree[x].siz+=tree[y].siz;
tree[x].lch=merge(tree[x].lch,tree[y].lch);tree[x].rch=merge(tree[x].rch,tree[y].rch);
return x;
}
int main(){
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=n;i++){
scanf("%d",&h[i]);
a[i]=h[i];fa[i]=i;
}
sort(a+1,a+n+1);
for(int i=1;i<=n;i++)h[i]=lower_bound(a+1,a+n+1,h[i])-a;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].cost);
}
sort(e+1,e+m+1);
for(int i=1;i<=q;i++){
scanf("%d%d%d",&que[i].v,&que[i].x,&que[i].k);que[i].id=i;
}
for(int i=1;i<=n;i++){
fa[i]=i;
root[i]=++num;
insert(root[i],1,n,h[i]);
}
sort(que+1,que+q+1);
for(int i=1;i<=q;i++){
while(cnt<m and e[cnt+1].cost<=que[i].x){
int fx=find(e[++cnt].u);
int fy=find(e[cnt].v);
if(fx==fy)continue;
fa[fx]=fy;
root[fy]=merge(root[fx],root[fy]);
}
int rot=root[find(que[i].v)],ret=query(rot,1,n,tree[rot].siz-que[i].k+1);
ans[que[i].id]=~ret?a[ret]:ret;
}
for(int i=1;i<=q;i++){
printf("%d\n",ans[i]);
}
return 0;
}
bzoj3545 Peaks 线段树合并的更多相关文章
- Peaks 线段树合并
Peaks 线段树合并 \(n\)个带权值\(h_i\)山峰,有\(m\)条山峰间双向道路,\(q\)组询问,问从\(v_i\)开始只经过\(h_i\le x\)的路径所能到达的山峰中第\(k\)高的 ...
- 【bzoj3545】[ONTAK2010]Peaks 线段树合并
[bzoj3545][ONTAK2010]Peaks 2014年8月26日3,1512 Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路 ...
- BZOJ.3545.[ONTAK2010]Peaks(线段树合并)
题目链接 \(Description\) 有n个座山,其高度为hi.有m条带权双向边连接某些山.多次询问,每次询问从v出发 只经过边权<=x的边 所能到达的山中,第K高的是多少. \(Solut ...
- 【线段树合并】bzoj3545: [ONTAK2010]Peaks
1A还行 Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问, ...
- [BZOJ3545] [ONTAK2010]Peaks(线段树合并 + 离散化)
传送门 由于困难值小于等于x这个很恶心,可以离线处理,将边权,和询问时的x排序. 每到一个询问的时候,将边权小于等于x的都合并起来再询问. .. 有重复元素的线段树合并的时间复杂度是nlog^2n # ...
- BZOJ3545 Peaks 离线处理+线段树合并
题意: 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只经 ...
- 线段树合并&&启发式合并笔记
这俩东西听起来很高端,实际上很好写,应用也很多~ 线段树合并 线段树合并,顾名思义,就是建立一棵新的线段树保存原有的两颗线段树的信息. 考虑如何合并,对于一个结点,如果两颗线段树都有此位置的结点,则直 ...
- [XJOI NOI2015模拟题13] C 白黑树 【线段树合并】
题目链接:XJOI - NOI2015-13 - C 题目分析 使用神奇的线段树合并在 O(nlogn) 的时间复杂度内解决这道题目. 对树上的每个点都建立一棵线段树,key是时间(即第几次操作),动 ...
- [BZOJ 2212] [Poi2011] Tree Rotations 【线段树合并】
题目链接:BZOJ - 2212 题目分析 子树 x 内的逆序对个数为 :x 左子树内的逆序对个数 + x 右子树内的逆序对个数 + 跨越 x 左子树与右子树的逆序对. 左右子树内部的逆序对与是否交换 ...
随机推荐
- 窗口Dialog
Dialog是窗口的意思,它是Window的子类.与frame相比,frame是我们大的窗口,而dialog便是那种弹出来和你说话的对话框. Dialog类的默认布局是BorderLayout Dia ...
- 413 Arithmetic Slices 等差数列划分
如果一个数列至少有三个元素,并且任意两个相邻元素之差相同,则称该数列为等差数列.例如,以下数列为等差数列:1, 3, 5, 7, 97, 7, 7, 73, -1, -5, -9以下数列不是等差数列. ...
- [转]F# Samples 101 - Visual Studio 2010
http://code.msdn.microsoft.com/F-Samples-101-0576cb9f/sourcecode?fileId=18956&pathId=1045958806 ...
- AJPFX关于this用法和注意事项
this:代表对象.就是所在函数所属对象的引用.哪个对象调用了this所在的函数,this就代表哪个对象,就是哪个对象的引用.开发时在定义功能时,如果该功能内部使用到了调用该功能的对象,这时就用thi ...
- (六)Mybatis总结之延迟加载
应用场景: i.假如一个用户他有N个订单(N>=1000),那么如果一次性加载的话,一个用户对象的订单集合OrderList里面就会有1000多个Order的对象.计算:一个订单对象里面数据有多 ...
- nginx for ubuntu
1.创建文件夹 :mkdir nginx 2.解压nginx: tar zxvf nginx.gz.tar 3.nginx 初始化:在nginx的路径下执行:./configure 有可能会报错: . ...
- 怎么学好XXX
怎么学好数据库是一个比较大题目,数据库不仅仅是写SQL那么简单,即使知道了SQL怎么写,还需要很清楚的知道这条SQL他大概扫描了多少数据,返回多少数据,是否需要创建索引.至于SQL优化是一个比较专业的 ...
- SQL Server性能调优——报表数据库与业务数据库分离
前段时间把公司的主数据库切了,分成业务库和报表库,业务库向报表库进行实时的Replication.这个项目的上线提升了系统的性能和可维护性,现在把设计时的考量和所做的工作重新回顾一下,作为备忘. 项目 ...
- tomcat不打印日志
commons-logging.jar导入这个包到tomcat lib下 2.修改tomcat的bin目录下面的catalina.bat文件 只需修改:set CLASSPATH=%CLASSP ...
- Swift3命名空间的实现
最近在看一些Swift开源库的时候,发现了一些优秀的开源库都使用了命名空间,例如Kingfisher这个开源库中,就针对UIImage,UIImageView,UIButton做了命名空间的扩展.通过 ...