[bzoj2733]永无乡&&[bzoj3545]Peaks
并不敢说完全会了线段树合并,只是至少知道原理写法了。。。还是太菜了,每天被大佬吊锤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的更多相关文章
- BZOJ2733 永无乡【splay启发式合并】
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- BZOJ2733 永无乡 【splay启发式合并】
2733: [HNOI2012]永无乡 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 4190 Solved: 2226 [Submit][Sta ...
- [BZOJ2733]永无乡
Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以 ...
- bzoj2733永无乡
永无乡 HYSBZ - 2733 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接, ...
- bzoj2733 永无乡 splay树的启发式合并
https://vjudge.net/problem/HYSBZ-2733 给一些带权点,有些点是互相连通的, 然后给出2种操作,在两点间加一条边,或者询问一个点所在的连通块内的第k小值的编号 并查集 ...
- 【BZOJ2733】永无乡(线段树,并查集)
[BZOJ2733]永无乡(线段树,并查集) 题面 BZOJ 题解 线段树合并 线段树合并是一个很有趣的姿势 前置技能:动态开点线段树 具体实现:每次合并两棵线段树的时候,假设叫做\(t1,t2\), ...
- [bzoj2733][HNOI2012]永无乡_权值线段树_线段树合并
永无乡 bzoj-2733 HNOI-2012 题目大意:题目链接. 注释:略. 想法: 它的查询操作非常友善,就是一个联通块内的$k$小值. 故此我们可以考虑每个联通块建一棵权值线段树. 这样的话每 ...
- 【题解】永无乡 [HNOI2012] [BZOJ2733] [P3224]
[题解]永无乡 [HNOI2012] [BZOJ2733] [P3224] [题目描述] 永无乡包含 \(n\) 座岛,编号从 \(1\) 到 \(n\) ,每座岛都有自己的独一无二的重要度,按照重要 ...
- 【BZOJ-2733】永无乡 Splay+启发式合并
2733: [HNOI2012]永无乡 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2048 Solved: 1078[Submit][Statu ...
随机推荐
- Extjs4如何构造store基类
目标:重写一个BaseStore的基类,它继承自Ext.data.Store基类. autoLoad:true/false 是否自动加载,true时创建store即自动加载,一般适合get方式:fal ...
- SQL varchar转float实现数字比较
select * from table where cast('经纬度' as float ) < 90
- redis笔记(四)
本篇内容主要是简单介绍redis在python中的使用from time import sleep在python代码中使用redis需要导入redis packageimport redis简单的连接 ...
- 前端怎样学习react
这是一个很长的话题.....慢慢写
- jmter安装配置
一 JMeter 简介 JMeter 它是Apache组织的开放源代码项目,它是现在比较流行的功能和性能测试的工具.JMeter requires a fully compliant JVM 7 or ...
- 228. Summary Ranges (everyday promlems) broken problems
Given a sorted integer array without duplicates, return the summary of its ranges. Example 1: Input: ...
- IOS 公司标示和方向域名
1. 公司标示使用反向域名========================================正向域名 www.baidu.com 用来标示一台网络主机反向域名 cn.itcast.Myd ...
- 制作URL以GET方式提交的简单加密程序
首先我们用到的是 DESCryptoServiceProvider 类 对此微软给出的解释是 定义访问数据加密标准 (DES) 算法的加密服务提供程序 (CSP) 版本的包装对象.无法继承此类. 接下 ...
- 2017.10.26 JavaWeb----第五章 JavaBean技术
JavaWeb----第五章 JavaBean技术 (1)JavaBean技术 JavaBean技术是javaweb程序的重要组成部分,是一个可重复使用的软件组件,是用Java语言编写的.遵循一定的标 ...
- json 序列化和反序列化的3个方法
https://www.cnblogs.com/caofangsheng/p/5687994.html