P4197 Peaks

并不会克鲁斯卡尔重构树,于是就写了离线算法。

使用了最小生成树,启发式合并treap

在最小生成树,克鲁斯卡尔算法 时 ,将询问一块处理。便可以保证询问时边的要求。然后利用平衡树,加速计算。

// luogu-judger-enable-o2
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <ctime> #define Ls T[R].ch[0]
#define Rs T[R].ch[1]
#define T_d T[R].ch[d] using std::sort; const int maxn=201000;
const int inf=0x7fffffff; struct Tree
{
int val;
int key;
int Size;
int Self;
int ch[2];
Tree(int a=0,int b=1,int c=1)
{
key=rand();
val=a;
Size=b;
Self=c;
ch[0]=ch[1]=0;
}
void Clear()
{
Size=Self;
ch[0]=ch[1]=0;
}
}; struct Data
{
int A,B;
int Value,Tag;
int Num;
Data (int a=0,int b=0,int v=0,int t=-inf,int n=0)
{
A=a;B=b;
Value=v;
Tag=t;
Num=n;
}
}; Tree T[maxn];
Data base[maxn*5];
int h[maxn],f[maxn],tail;
int belong[maxn],ans[maxn*5]; int Find(int x)
{
if(f[x]==x) return f[x];
return f[x]=Find(f[x]);
} int compare(const Data &a,const Data &b)
{
if(a.Value!=b.Value) return a.Value<b.Value;
return a.Tag<b.Tag;
} int cmpkth(int R,int kth)
{
int s=T[Rs].Size;
if(kth<=s) return 1;
if(kth>s+T[R].Self) return 0;
return -1;
} int cmpval(int R,int val)
{
if(T[R].val==val) return -1;
return T[R].val<val;
} void Sum(int R)
{
T[R].Size=T[R].Self+T[Ls].Size+T[Rs].Size;
return ;
} void Rotate(int &R,int dir)
{
int k=T[R].ch[dir^1];
T[R].ch[dir^1]=T[k].ch[dir];
T[k].ch[dir]=R;
Sum(R);Sum(k);
R=k;
} int Seek_kth(int R,int kth)
{
int d=cmpkth(R,kth);
if(d==-1) return T[R].val;
return Seek_kth(T_d,kth-=( d==0 ? T[Rs].Size+T[R].Self : 0 ));
} void Insert(int &R,int val,int model=0,int num=0)
{
if(R==0)
{
if(model==0){ R=++tail;T[R]=Tree(val); }
else { T[num].Clear();R=num; }
return ;
}
int d=cmpval(R,val);
if(d==-1)
{
int add=( model ? T[num].Self : 1 );
T[R].Self+=add;
T[R].Size+=add;
return ;
}
Insert(T_d,val,model,num);
Sum(R);
if(T[T_d].key>T[R].key) Rotate(R,d^1);
return ;
} void _merge(int &R,int &Dir)
{
if(R==0) return ;
_merge(Ls,Dir);
_merge(Rs,Dir);
Insert(Dir,T[R].val,1,R);
return ;
} void Merge(int &A,int &B,int f1,int f2)
{
if(T[A].Size>T[B].Size)
{
_merge(B,A);
f[f2]=f1;
B=A;
return ;
}
else
{
_merge(A,B);
f[f1]=f2;
A=B;
return ;
}
} void visit(int now)
{
if(now==0) return ;
visit(T[now].ch[0]);
printf("%d ",T[now].val);
visit(T[now].ch[1]);
} int main()
{
srand(time(NULL));
int n,m,q;
T[0].Self=0;T[0].Size=0;
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=n;i++)
scanf("%d",&h[i]),f[i]=i;
for(int i=1;i<=n;i++)
Insert(belong[i],h[i]);
for(int i=1;i<=m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
base[i]=Data(a,b,c);
}
for(int i=1;i<=q;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
base[i+m]=Data(a,c,b,0,i);
ans[i]=-1;
}
sort(base+1,base+1+m+q,compare);
for(int i=1;i<=m+q;i++)
{
if(base[i].Tag==0)
{
int _f=Find(base[i].A);
if(T[belong[_f]].Size>=base[i].B)
ans[base[i].Num]=Seek_kth(belong[_f],base[i].B);
}
else
{
int f1=Find(base[i].A),f2=Find(base[i].B);
if(f1==f2) continue;
Merge(belong[f1],belong[f2],f1,f2);
}
}
for(int i=1;i<=q;i++)
printf("%d\n",ans[i]);
// return 0;
return 0;
}

Luogu_4197 Peaks的更多相关文章

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

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

  2. *[codility]Peaks

    https://codility.com/demo/take-sample-test/peaks http://blog.csdn.net/caopengcs/article/details/1749 ...

  3. Clustering by density peaks and distance

    这次介绍的是Alex和Alessandro于2014年发表在的Science上的一篇关于聚类的文章[13],该文章的基本思想很简单,但是其聚类效果却兼具了谱聚类(Spectral Clustering ...

  4. Science论文"Clustering by fast search and find of density peaks"学习笔记

    "Clustering by fast search and find of density peaks"是今年6月份在<Science>期刊上发表的的一篇论文,论文中 ...

  5. bzoj 3545&&3551: [ONTAK2010]Peaks &&加强版 平衡树&&并查集合并树&&主席树

    3545: [ONTAK2010]Peaks Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 635  Solved: 177[Submit][Stat ...

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

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

  7. bzoj 3551: [ONTAK2010]Peaks加强版

    Description [题目描述]同3545 Input 第一行三个数N,M,Q. 第二行N个数,第i个数为h_i 接下来M行,每行3个数a b c,表示从a到b有一条困难值为c的双向路径. 接下来 ...

  8. BZOJ 3551: [ONTAK2010]Peaks加强版 [Kruskal重构树 dfs序 主席树]

    3551: [ONTAK2010]Peaks加强版 题意:带权图,多组询问与一个点通过边权\(\le lim\)的边连通的点中点权k大值,强制在线 PoPoQQQ大爷题解传送门 说一下感受: 容易发现 ...

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

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

随机推荐

  1. eclipse 更改背景颜色字体

    原文 切一个自己的图: 废话不说,直接入题. 方式一:替换Eclipse的配置文件 其实Eclipse的各种配置都是在文件设置里的,因此只要用一个配置好的模版来替换默认的配置文件,即可将所有配置克隆到 ...

  2. CSS3字体火焰燃烧效果

    动画的CSS: // fire @keyframes fireDiv { 0% { text-shadow: 0 0 4px white, 0 -5px 4px #ff3, 2px -10px 6px ...

  3. numpy数组属性查看及断言

    numpy数组属性查看:类型.尺寸.形状.维度   import numpy as np a1 = np.array([1,2,3,4],dtype=np.complex128) print(a1) ...

  4. How do I use the API correctly

    1:打开帮助文档2:点击显示,找到索引,看到输入框3:你要学习什么内容,你就在框框里面输入什么内容 举例:Random4:看包 java.lang包下的类在使用的时候是不需要导包的5:看类的描述 Ra ...

  5. 路飞学城知识点4之Django contenttypes 应用

    Django contenttypes 应用 contenttypes 是Django内置的一个应用,可以追踪项目中所有app和model的对应关系,并记录在ContentType表中. 每当我们创建 ...

  6. php 函数func_get_args()、func_get_arg()与func_num_args()之间的区别

    php经常会有一些看似相近的函数,然而区别很大.[func_get_arg(),func_get_args(),func_num_args()]的区别,我们先看一下,下面的实例代码 从上面的结果中我们 ...

  7. .net core系列之《.net core中使用集成IDistributedCache接口的Redis和MongoDB实现分布式缓存》

    分布式的缓存可以提高性能和可伸缩性的 ASP.NET Core 应用程序,尤其是托管在云中或服务器场中时. 什么是分布式的缓存 分布式的缓存由多个应用程序服务器共享,缓存中的信息不存储在单独的 Web ...

  8. asp.net session 保存实体类对象

    存:User user=new User();session["USER"]=user; 取:User u= (User ) session["USER"];

  9. 在python中逐行读取大文件

    在我们日常工作中,难免会有处理日志文件的时候,当文件小的时候,基本不用当心什么,直接用file.read()或readlines()就可以了,但是如果是将一个10G大小的日志文件读取,即文件大于内存的 ...

  10. pandas 入门

    1. 默认的pandas不能读取excel.需要安装xlrd, xlwt才能支持excel的读写 pip install xlrd #添加读取excel功能 pip install xlwt #添加写 ...