链接

https://www.lydsy.com/JudgeOnline/problem.php?id=3545

离线询问,按照权值排个序

就是在克鲁斯卡尔时候维护个treap,到时候挨个查询一下就好了

nb的gzy说要要在线才是呢,nb

代码

/**************************************************************
Problem: 3545
User: gryz2016
Language: C++
Result: Accepted
Time:8708 ms
Memory:69660 kb
****************************************************************/ #include <iostream>
#include <ctime>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
using namespace std;
const int N=1e5+7;
const int inf=0x3f3f3f3f;
int read() {
int x=0,f=1;char s=getchar();
for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
return x*f;
}
int ch[N*40][2],siz[N*40],cnt;
void build(int l,int r,int L,int &now) {
if(!now) now=++cnt;
siz[now]++;
if(l==r) return;
int mid=(l+r)>>1;
if(L<=mid) build(l,mid,L,ch[now][0]);
else build(mid+1,r,L,ch[now][1]);
}
int merge(int x,int y) {
if(!x||!y) return x+y;
siz[x]+=siz[y];
ch[x][0]=merge(ch[x][0],ch[y][0]);
ch[x][1]=merge(ch[x][1],ch[y][1]);
return x;
}
int query(int l,int r,int k,int rt) {
if(l==r) return l;
int mid=(l+r)>>1;
if(siz[ch[rt][0]]>=k) return query(l,mid,k,ch[rt][0]);
else return query(mid+1,r,k-siz[ch[rt][0]],ch[rt][1]);
}
struct node {int u,v,q;}e[N*5];
bool cmp1(node a,node b) {return a.q<b.q;}
struct QQQ {int v,x,k,id;}Q[N*5];
bool cmp2(QQQ a,QQQ b) {return a.x<b.x;}
int n,m,q,a[N*5],f[N*5],ans[N*5],rt[N*5];
int find(int x) {return f[x]==x ? x : f[x]=find(f[x]);}
void uu(int x,int y) {
if(x==y) return;
rt[y]=merge(rt[x],rt[y]);
f[y]=x;
}
int main() {
// freopen("1.in","r",stdin);
// freopen("a.out","w",stdout);
n=read(),m=read(),q=read();
for(int i=1;i<=n;++i) a[i]=read();
for(int i=1;i<=m;++i) e[i].u=read(),e[i].v=read(),e[i].q=read();
for(int i=1;i<=q;++i) Q[i].v=read(),Q[i].x=read(),Q[i].k=read(),Q[i].id=i;
sort(e+1,e+1+m,cmp1);
sort(Q+1,Q+1+q,cmp2);
for(int i=1;i<=n;++i) f[i]=i,build(1,1e9,a[i],rt[i]);
int js=1;
memset(ans,-1,sizeof(ans));
for(int i=1;i<=m;++i) {
int fx=find(e[i].u),fy=find(e[i].v);
if(fx==fy) continue;
while(Q[js].x<e[i].q&&js<=q) {
int fa=find(Q[js].v);
if(siz[rt[fa]]>=Q[js].k)
ans[Q[js].id]=query(1,1e9,siz[rt[fa]]-Q[js].k+1,rt[fa]);
js++;
}
uu(fx,fy);
}
while(Q[js].k<=e[n].q&&js<=q) {
int fa=find(Q[js].v);
if(siz[rt[fa]]>=Q[js].k)
ans[Q[js].id]=query(1,1e9,siz[rt[fa]]-Q[js].k+1,rt[fa]);
js++;
}
for(int i=1;i<=q;++i) printf("%d\n", ans[i]);
return 0;
}

3545: [ONTAK2010]Peaks 平衡树,最小生成树的更多相关文章

  1. BZOJ 3545: [ONTAK2010]Peaks( BST + 启发式合并 + 并查集 )

    这道题很好想, 离线, 按询问的x排序从小到大, 然后用并查集维护连通性, 用平衡树维护连通块的山的权值, 合并就用启发式合并.时间复杂度的话, 排序是O(mlogm + qlogq), 启发式合并是 ...

  2. BZOJ 3545: [ONTAK2010]Peaks [Splay启发式合并]

    3545: [ONTAK2010]Peaks 题意:带权图,多组询问与一个点通过边权\(\le x\)的边连通的点中点权k大值 又读错题了,输出点一直WA,问的是点权啊 本题加强版强制在线了,那这道题 ...

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

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

  4. ●BZOJ 3545 [ONTAK2010]Peaks(离线)

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3545 http://www.lydsy.com/JudgeOnline/problem.ph ...

  5. BZOJ.3545.[ONTAK2010]Peaks(线段树合并)

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

  6. bzoj 3545: [ONTAK2010]Peaks

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1124  Solved: 304[Submit][Status][Discuss] Descripti ...

  7. bzoj 3545: [ONTAK2010]Peaks Kruskal重构树

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

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

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

  9. BZOJ 3545: [ONTAK2010]Peaks 启发式合并 + 离线 + Splay

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

随机推荐

  1. C# Dapper 简单实例

    /// <summary> /// 分页信息 /// </summary> public class PageInfo<T>     {         /// & ...

  2. mysql优化(四)

    一.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where / group by / order by 涉及的列上建立索引. 1.索引失效情况. SQL什么条件会使用索引? 当字段上建有索引时, ...

  3. leetCodeReorderList链表合并

    原题 Given a singly linked list L: L0?L1?-?Ln-1?Ln, reorder it to: L0?Ln?L1?Ln-1?L2?Ln-2?- You must do ...

  4. Discuz目录结构

    /source/class/task站点任务内置包 task_avatar.php头像类任务 task_blog.php发表日志任务 task_connect_bind.phpQQ 帐号绑定任务 ta ...

  5. hdu5489 树状数组+dp

    2015-10-06 21:49:54 这题说的是个给了一个数组,然后删除任意起点的一个连续的L个数,然后求最长递增子序列<是递增,不是非递减>,用一个树状数组维护一下就ok了 #incl ...

  6. Born Slippy (超大背包问题 + 树形DP)

    首先是需要我们知道的是假设又一条链给你让你求最大值,你会求吗?当然会,就是时间有点爆炸O(n2).那不行,要是如果我把到达每个点的最大值以及他对后面的贡献情况都求出来后放在数组里面,然后到了新的节点直 ...

  7. python练习:一行搞定-统计一句话中每个单词出现的个数

    一行搞定-统计一句话中每个单词出现的个数 >>> s'i am a boy a bood boy a bad boy' 方式一:>>> dict([(i,s.spl ...

  8. HADOOP nutch java mysql

    下载Hadoop安装包 wget  http://apache.fayea.com/hadoop/common/hadoop-2.7.2/hadoop-2.7.2.tar.gz   java安装 wg ...

  9. qt 提高图片加载速度

    一,将图片在pc上解析,然后将解析文件放到qrc文件中,读取qrc文件. 1,将图片解析后的二进制文件保存,源码如下, 下载地址:https://files.cnblogs.com/files/sen ...

  10. JustOj 1936: 小明A+B

    题目描述 小明今年3岁了, 现在他已经能够认识100以内的非负整数, 并且能够进行100以内的非负整数的加法计算. 对于大于等于100的整数, 小明仅保留该数的最后两位进行计算, 如果计算结果大于等于 ...