并不敢说完全会了线段树合并,只是至少知道原理写法了。。。还是太菜了,每天被大佬吊锤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. tomcat的相关使用

    tomcat服务器是apache下非常优秀的一款web服务器,当今的互联网企业中90%左右的中小型企业使用的都是tomcat.tomcat在部署项目时有很多很多的解决方案,这些你都清楚吗? 1.同一个 ...

  2. [转]Android时间获取与使用

    编写Android网络程序时难免会遇到手机时间不准确的问题,本文总结了一些常用的时间获取与校正方法: 转载请注明:http://blog.csdn.net/xzy2046 1.获取本机当前时间: Ti ...

  3. 安装纯净 ubuntu linux (非虚拟机)

    //--------------- Chinese version --------------------------------------------------// 前提条件:有另一台电脑(w ...

  4. Codeforces Codeforces Round #383 (Div. 2) E (DFS染色)

    题目链接:http://codeforces.com/contest/742/problem/E 题意: 有一个环形的桌子,一共有n对情侣,2n个人,一共有两种菜. 现在让你输出一种方案,满足以下要求 ...

  5. AVR446_Linear speed control of stepper motor步进电机曲线分析

    1.1.  单片机代码处理 // 定义定时器预分频,定时器实际时钟频率为:72MHz/(STEPMOTOR_TIMx_PRESCALER+1) #define STEPMOTOR_TIM_PRESCA ...

  6. Python IDE PyCharm的快捷键大全

    Python IDE PyCharm的快捷键大全 1.编辑(Editing) Ctrl + Space 基本的代码完成(类.方法.属性) Ctrl + Alt + Space 快速导入任意类 Ctrl ...

  7. SpringBoot发布WAR启动报错:Error assembling WAR: webxml attribute is required

    Spring Boot发布war包流程: 1.修改web model的pom.xml <packaging>war</packaging> SpringBoot默认发布的都是j ...

  8. SpringBoot学习7:springboot整合jsp

    springboot内部对jsp的支持并不是特别理想,而springboot推荐的视图是Thymeleaf,对于java开发人员来说还是大多数人员喜欢使用jsp 1.创建maven项目,添加pom依赖 ...

  9. jquery操作DOM 元素(2)

    .after() 在匹配的元素集合中的每个元素后面插入参数指定的内容,作为其兄弟节点. .after(content[,content]) content HTML字符串 DOM 元素 元素数组 对象 ...

  10. angular学习之angular-phonecat项目的实现

    ---恢复内容开始--- AngularJS官方网站提供了一个用于学习的示例项目:PhoneCat.这是一个Web应用,用户可以浏览一些Android手机,了解它们的详细信息,并进行搜索和排序操作. ...