Luogu_4197 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的更多相关文章
- 【BZOJ-3545&3551】Peaks&加强版 Kruskal重构树 + 主席树 + DFS序 + 倍增
3545: [ONTAK2010]Peaks Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1202 Solved: 321[Submit][Sta ...
- *[codility]Peaks
https://codility.com/demo/take-sample-test/peaks http://blog.csdn.net/caopengcs/article/details/1749 ...
- Clustering by density peaks and distance
这次介绍的是Alex和Alessandro于2014年发表在的Science上的一篇关于聚类的文章[13],该文章的基本思想很简单,但是其聚类效果却兼具了谱聚类(Spectral Clustering ...
- Science论文"Clustering by fast search and find of density peaks"学习笔记
"Clustering by fast search and find of density peaks"是今年6月份在<Science>期刊上发表的的一篇论文,论文中 ...
- bzoj 3545&&3551: [ONTAK2010]Peaks &&加强版 平衡树&&并查集合并树&&主席树
3545: [ONTAK2010]Peaks Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 635 Solved: 177[Submit][Stat ...
- BZOJ 3545: [ONTAK2010]Peaks( BST + 启发式合并 + 并查集 )
这道题很好想, 离线, 按询问的x排序从小到大, 然后用并查集维护连通性, 用平衡树维护连通块的山的权值, 合并就用启发式合并.时间复杂度的话, 排序是O(mlogm + qlogq), 启发式合并是 ...
- bzoj 3551: [ONTAK2010]Peaks加强版
Description [题目描述]同3545 Input 第一行三个数N,M,Q. 第二行N个数,第i个数为h_i 接下来M行,每行3个数a b c,表示从a到b有一条困难值为c的双向路径. 接下来 ...
- BZOJ 3551: [ONTAK2010]Peaks加强版 [Kruskal重构树 dfs序 主席树]
3551: [ONTAK2010]Peaks加强版 题意:带权图,多组询问与一个点通过边权\(\le lim\)的边连通的点中点权k大值,强制在线 PoPoQQQ大爷题解传送门 说一下感受: 容易发现 ...
- BZOJ 3545: [ONTAK2010]Peaks [Splay启发式合并]
3545: [ONTAK2010]Peaks 题意:带权图,多组询问与一个点通过边权\(\le x\)的边连通的点中点权k大值 又读错题了,输出点一直WA,问的是点权啊 本题加强版强制在线了,那这道题 ...
随机推荐
- C#学习笔记-代理模式
题目:A追B,但是羞于表示,所以A通过C给B一直送礼物以讨得欢心. 分析: 根据就分为三个类,SchoolGirl一个类,这个类只需要获得名字就好了:Pursuit一个类,这个类需要实现送礼物这个方法 ...
- ADO.NET对象模型之间的关系
ADO.Net支持两种访问数据的模型:无连接模式和连接模式 无连接模式将数据下载到客户机器上,并在客户机上将数据封装到内存中, 可以向访问本地关系数据库一样访问内存中的数据(例如DataSet), 连 ...
- PoPo数据可视化周刊第一期
PoPo数据可视化 聚焦于Web数据可视化领域, 发现前端可视化领域有意思的内容. 涵盖前端可视化领域最新资讯, 开源可视化库的发布更新消息, 可视化案例分析与讲解, 可视化技术文章, 可视化大神的日 ...
- border-radius圆角兼容方案
1.下载ie-css3.htc 2.CSS代码段 box { -moz-border-radius: 15px; /* Firefox */ -webkit-border-radius: 15px; ...
- HTML中的图片
在一开始时,Web仅有文本,那真的是很无趣.幸运的是,没过多久网页上就能嵌入图片和其他有趣的内容了.虽然还有许多其他类型的多媒体,但是从地位比较低的<img>元素开始是符合逻辑的,它常常被 ...
- Python爬虫教程-11-proxy代理IP,隐藏地址(猫眼电影)
Python爬虫教程-11-proxy代理IP,隐藏地址(猫眼电影) ProxyHandler处理(代理服务器),使用代理IP,是爬虫的常用手段,通常使用UserAgent 伪装浏览器爬取仍然可能被网 ...
- Spring中的转换器:Converter
配置spring的配置文件: <bean id="conversionService" class="org.springframework.context.sup ...
- 【 PostgreSQL】十条实用数据库SQL优化建议
基于PostgreSQL,总结几条常用的查询操作的优化建议,部分也适用于Oracle等数据库. 1.选择合适的分布键 分布键选择不当会导致重分布.数据分布不均等,而数据分布不均会使SQL集中在一个se ...
- 用POP动画编写带富文本的自定义动画效果
用POP动画编写带富文本的自定义动画效果 [源码] https://github.com/YouXianMing/UI-Component-Collection [效果] [特点] * 支持富文本 * ...
- Python学习---网络编程 1217【all】
OSI七层模型: 物理层, 数据链路层, 网络层,传输层,会话层,表达层,应用层 应用层:TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等 传输层:TCP,UDP 网络层:I ...