并不敢说完全会了线段树合并,只是至少知道原理写法了。。。还是太菜了,每天被大佬吊锤qwq

我看到的几道线段树合并都是权值线段树的合并。这个算法适用范围应该只是01线段树的。

这两道算入门题了吧。。。

发现粘题面没人看(自己都懒得看),以后粘链接加题意吧。

永无乡

给$n$个没有连边的带权点,动态加边,询问$u$所在连通块权值第$k$大的点是什么。$n \leq 1e5 , q\leq 3e5$

离线永无乡??

给定森林,点有点权有重复!,边有边权。询问$u$所在连通块,只能走边权小于$w$的边,可达的权值第$k$大的点编号!是什么。$n \leq 1e5 , m,q \leq 5e5$ 被坑的巨惨qwq

后面的离线一下,按边权从小到大加进去就和永无乡一样了。

并查集维护连通性,并将两个连通块的权值线段树合并。询问就是在所在连通块线段树二分找。$(O(nlogn))$

#include<bits/stdc++.h>
using namespace std;
const int N=;
inline int read(){
int r=,c=getchar();
while(!isdigit(c))c=getchar();
while(isdigit(c))
r=r*+c-'',c=getchar();
return r;
}
int fa[N],rt[N],n,m;
int find(int x){
return x==fa[x]?x:fa[x]=find(fa[x]);
}
struct Node{
int L,R,sum;
}T[N*];
int sz;
#define ls T[o].L
#define rs T[o].R
void pullup(int o){
T[o].sum=T[ls].sum+T[rs].sum;
}
void ins(int &o,int l,int r,int v){
if(!o)o=++sz;
if(l==r){
T[o].sum=;return;
}
int mid=l+r>>;
if(v<=mid)ins(ls,l,mid,v);
else ins(rs,mid+,r,v);
pullup(o);
}
int merge(int x,int y){
if(!x)return y;
if(!y)return x;
T[x].L=merge(T[x].L,T[y].L);
T[x].R=merge(T[x].R,T[y].R);
pullup(x);
return x;
}
int query(int o,int l,int r,int rk){
if(l==r)return l;
int mid=l+r>>;
if(rk<=T[ls].sum)return query(ls,l,mid,rk);
else return query(rs,mid+,r,rk-T[ls].sum);
}
void Link(int x,int y){
int u=find(x),v=find(y);
fa[u]=v;rt[v]=merge(rt[u],rt[v]);
}
int a[N],id[N];
void init(){
n=read(),m=read();
for(int i=;i<=n;i++)
a[i]=read(),id[a[i]]=fa[i]=i;
while(m--){
int u=read(),v=read();
fa[find(u)]=find(v);
}
for(int i=;i<=n;i++)
ins(rt[find(i)],,n,a[i]);
}
void solve(){
m=read();
char s[];
while(m--){
scanf("%s",s);
if(s[]=='B'){
int u=read(),v=read();
Link(u,v);
}
else{
int u=find(read()),rk=read();
if(T[rt[u]].sum<rk)puts("-1");
else printf("%d\n",id[query(rt[u],,n,rk)]);
}
}
}
int main(){
init();
solve();
}

2733

#include<bits/stdc++.h>
using namespace std;
const int N=;
const int M=;
inline int read(){
int r=,c=getchar();
while(!isdigit(c))c=getchar();
while(isdigit(c))
r=r*+c-'',c=getchar();
return r;
}
int n,m,q;
struct Edge{
int u,v,w;
friend bool operator < (Edge p,Edge q){
return p.w<q.w;
}
}e[M];
struct ask{
int u,w,k,ans,id;
}a[M];
bool cmpw(ask p,ask q){
return p.w<q.w;
}
bool cmpid(ask p,ask q){
return p.id<q.id;
}
int fa[N],h[N],t[N],id[N];
inline int find(int x){
return x==fa[x]?x:fa[x]=find(fa[x]);
}
int rt[N],sz;
struct Node{
int L,R,sum;
}T[N*];
#define ls T[o].L
#define rs T[o].R
#define mid (l+r>>1)
inline void pullup(int o){
T[o].sum=T[ls].sum+T[rs].sum;
}
void ins(int &o,int l,int r,int val){
if(!o)o=++sz;
if(l==r){
T[o].sum=;return;
}
if(val<=mid)ins(ls,l,mid,val);
else ins(rs,mid+,r,val);
pullup(o);
}
int query(int o,int l,int r,int rk){
if(l==r){
return t[l];
}
if(rk<=T[ls].sum)return query(ls,l,mid,rk);
else return query(rs,mid+,r,rk-T[ls].sum);
}
int merge(int x,int y){
if(!x)return y;
if(!y)return x;
if(!T[x].L&&!T[x].R){
T[x].sum+=T[y].sum;
return x;
}
T[x].L=merge(T[x].L,T[y].L);
T[x].R=merge(T[x].R,T[y].R);
pullup(x);return x;
}
inline void Link(int x,int y){
x=find(x),y=find(y);
if(x==y)return;
fa[y]=x;
rt[x]=merge(rt[x],rt[y]);
}
void init(){
n=read(),m=read(),q=read();
for(int i=;i<=n;i++)
h[i]=t[i]=read(),fa[i]=i;
sort(t+,t+n+);
for(int i=;i<=n;i++){
h[i]=lower_bound(t+,t+n+,h[i])-t;
ins(rt[i],,n,h[i]);
}
for(int i=;i<=m;i++)
e[i].u=read(),e[i].v=read(),e[i].w=read();
sort(e+,e+m+);
for(int i=;i<=q;i++)
a[i].u=read(),a[i].w=read(),a[i].k=read(),a[i].id=i;
sort(a+,a+q+,cmpw);
}
void solve(){
int now=;
for(int i=;i<=q;i++){
int lim=a[i].w,rk=a[i].k;
while(e[now].w<=lim&&now<=m){
Link(e[now].u,e[now].v);now++;
}
int u=find(a[i].u),siz=T[rt[u]].sum;
if(siz<rk){
a[i].ans=-;continue;
}
else rk=siz-rk+;
a[i].ans=query(rt[u],,n,rk);
}
sort(a+,a+q+,cmpid);
for(int i=;i<=q;i++)
printf("%d\n",a[i].ans);
}
int main(){
init();
solve();
}

3545

[bzoj2733]永无乡&&[bzoj3545]Peaks的更多相关文章

  1. BZOJ2733 永无乡【splay启发式合并】

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  2. BZOJ2733 永无乡 【splay启发式合并】

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 4190  Solved: 2226 [Submit][Sta ...

  3. [BZOJ2733]永无乡

    Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以 ...

  4. bzoj2733永无乡

    永无乡 HYSBZ - 2733 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接, ...

  5. bzoj2733 永无乡 splay树的启发式合并

    https://vjudge.net/problem/HYSBZ-2733 给一些带权点,有些点是互相连通的, 然后给出2种操作,在两点间加一条边,或者询问一个点所在的连通块内的第k小值的编号 并查集 ...

  6. 【BZOJ2733】永无乡(线段树,并查集)

    [BZOJ2733]永无乡(线段树,并查集) 题面 BZOJ 题解 线段树合并 线段树合并是一个很有趣的姿势 前置技能:动态开点线段树 具体实现:每次合并两棵线段树的时候,假设叫做\(t1,t2\), ...

  7. [bzoj2733][HNOI2012]永无乡_权值线段树_线段树合并

    永无乡 bzoj-2733 HNOI-2012 题目大意:题目链接. 注释:略. 想法: 它的查询操作非常友善,就是一个联通块内的$k$小值. 故此我们可以考虑每个联通块建一棵权值线段树. 这样的话每 ...

  8. 【题解】永无乡 [HNOI2012] [BZOJ2733] [P3224]

    [题解]永无乡 [HNOI2012] [BZOJ2733] [P3224] [题目描述] 永无乡包含 \(n\) 座岛,编号从 \(1\) 到 \(n\) ,每座岛都有自己的独一无二的重要度,按照重要 ...

  9. 【BZOJ-2733】永无乡 Splay+启发式合并

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2048  Solved: 1078[Submit][Statu ...

随机推荐

  1. HBuilder中改造console.info

    HBuilder的js中console.info只会输出头一个参数,与谷歌浏览器行为不符合.让人很不习惯. 于是,对其改造一番. window.console.print=window.console ...

  2. 关于 Android Studio 如何连接手机调试

    第一步:设置-> 打开开发者选项,以及USB调试模式 第二步:关于手机->版本号,点击版本号会弹出提示:已经处于开发者模式,无需操作 第三步:设置->在搜索框中输入HDB,此时会弹出 ...

  3. 微信小程序之怎样识别一个小程序用户

    本节主要是说下怎样识别一个小程序的用户,需要用什么数据来做标识呢: 我们应该都知道判断是不是一个用户大部分都是通过userid来判断,如果这个用户访问的应用发送了一个请求,把userid之类的数据发给 ...

  4. 01、Scala介绍与安装

    01.Scala介绍与安装 1.1 Scala介绍 Scala是对java语言脚本化,特点是就是使不具备脚本化的java语言能够采用脚本化方式来使用,使其具有脚本语言简单.所见即所得的特点,并且编程效 ...

  5. 空间最短路径,BFS(POJ3278)

    题目链接:http://poj.org/problem?id=3278 #include <cstdio> #include <queue> #include <stri ...

  6. 数长方形有多少个?POJ(1693)

    题目链接:http://poj.org/problem?id=1693 解题报告: 随机选两根横的,再找一下与这两根横线相交的竖线有多少根,m,那么就有(m-1)*m/2个长方形. #include ...

  7. VPS 运行 Node.js 的一些经验

    VPS 系统选择 各系统安装难易对比 Ubuntu.Debian 较为简单,CentOS 稍麻烦,32位系统比64位更节省内存 DigitalOcean 甚至推出了 Ubuntu + Node.js ...

  8. Spring Security 实现记住我

    开篇一张图,道理全靠悟. 示例如下: 1.    新建Maven项目  remember_me 2.   pom.xml <project xmlns="http://maven.ap ...

  9. javaweb基础(38)_事务

    一.事务的概念 事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功. 例如:A——B转帐,对应于如下两条sql语句  update from account set mone ...

  10. 11、SpringBoot------定时任务

      开发工具:STS 代码下载链接:https://github.com/theIndoorTrain/Springboot/tree/52ef6c0c805913db1e66ed18671c322e ...