并不敢说完全会了线段树合并,只是至少知道原理写法了。。。还是太菜了,每天被大佬吊锤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. Linux目录配置——Linux目录配置标准:FHS

    事实上,FHS针对目录树架构仅定义出三层目录下应该放置哪些数据,分别是下面三个目录: 一./(根目录):与开机系统有关 根目录(/)所在分区应该越小越好,且应用程序所安装的软件最好不要与根目录放在同一 ...

  2. rosservice call ERROR:Unable to load type ... Have you typed 'make'

    you need to source in the new terminal $ source ~/catkin_ws/devel/setup.bash

  3. python 下实现window 截图

    首先安装PIL库,因为PIL官网没有支持python3.6的PIL库我想在3.X中实现,因此使用pip安装pillow pip install pillow 安装 安装完成后,from PIL imp ...

  4. 2018.8.2 Juint测试介绍及其命名的规范

    JUnit - 测试框架 什么是 Junit 测试框架? JUnit 是一个回归测试框架,被开发者用于实施对应用程序的单元测试,加快程序编制速度,同时提高编码的质量.JUnit 测试框架能够轻松完成以 ...

  5. JavaEE权限管理系统的搭建(三)--------springmvc和mabatis整合环境搭建

    本节介绍如何环境的搭建和配置: 首先要在父工程引入jar包依赖: <!-- 通过属性定义指定jar的版本 --> <properties> <spring.version ...

  6. 字符串缓冲区StringBuffer类,正则表达式

    StringBuffer类 StringBuffer又称为可变字符序列,它是一个类似于 String 的字符串缓冲区,通过某些方法调用可以改变该序列的长度和内容.它是一个容器,容器中可以装很多字符串. ...

  7. C/C++程序基础 (十一)标准模板库

    标准模板库 标准模板库在标准函数库的定位 迭代器(类似指针)保证算法(常用算法)和容器(数据结构)的结合. vector的实现 底层实现是动态数组,所以支持随机访问. 内部是动态数组,随着insert ...

  8. CentOS 6.5通过yum安装 MySQL-5.5

    1.安装mysql-5.5的yum源 rpm -ivh http://repo.mysql.com/yum/mysql-5.5-community/el/6/x86_64/mysql-communit ...

  9. python实现简单关联规则Apriori算法

    from itertools import combinations from copy import deepcopy # 导入数据,并剔除支持度计数小于min_support的1项集 def lo ...

  10. C#基础-面向对象-封装

    封装 命名空间 using System; using System.Collections.Generic; using System.Text; namespace ConsoleApp6 { c ...