线段树合并例题

https://www.luogu.com.cn/problem/P3224

1. 永无乡

题意:

 给 n 个岛屿,每个岛有一个标号,初始修有 m 条路,有两个操作,操作1 为 给两个岛屿之间修路,操作2为求出 所有能从当前岛屿到达的岛 中标号第k小的岛

思路:

求标号第k小的岛,我们考虑使用权值线段树,通过线段树上二分查找第k小,对于多个岛屿,我们考虑动态开点建 n 棵线段树,对于岛屿修路的操作 使用并查集维护连通块,并利用线段树合并实现岛屿合并

代码:

#include<bits/stdc++.h>
using namespace std;#define int long long
#define mid ((l+r)>>1)const int N=1e5+5;
int rt[N],n,m,num,id[N],f[N];
int ls[60*N],rs[60*N],cnt[60*N];int find(int x){return x==f[x]?x:f[x]=find(f[x]);}int merge(int x,int y,int l,int r){        //线段树合并if(!x)return y;if(!y)return x;if(l==r){cnt[x]+=cnt[y];return x;}ls[x]=merge(ls[x],ls[y],l,mid);rs[x]=merge(rs[x],rs[y],mid+1,r);cnt[x]=cnt[ls[x]]+cnt[rs[x]];return x;
}void upd(int &p,int l,int r,int x){    //建树if(!p)p=++num;if(l==r){cnt[p]=1;return;}if(x<=mid)upd(ls[p],l,mid,x);else upd(rs[p],mid+1,r,x);cnt[p]=cnt[ls[p]]+cnt[rs[p]];
}int q(int p,int l,int r,int k){    //二分查找第k小if(cnt[p]<k)return -1;if(l==r)return l;if(cnt[ls[p]]>=k)return q(ls[p],l,mid,k);return q(rs[p],mid+1,r,k-cnt[ls[p]]);
}void solve(){cin>>n>>m;for(int i=1;i<=n;i++){int x;cin>>x;id[x]=i;upd(rt[i],1,n,x);f[i]=i;}while(m--){int u,v;cin>>u>>v;if(find(u)==find(v))continue;u=find(u),v=find(v);rt[u]=merge(rt[u],rt[v],1,n);f[v]=u;}cin>>m;while(m--){string op;int x,y;cin>>op>>x>>y;if(op=="B"){if(find(x)==find(y))continue;x=find(x),y=find(y);rt[x]=merge(rt[x],rt[y],1,n);f[y]=x;}else{x=find(x);int ans=q(rt[x],1,n,y);if(ans!=-1)ans=id[ans];cout<<ans<<endl;}}return;
}signed main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int T=1;//cin>>T;while(T--){solve();}return 0;
}

2. 雨天的尾巴

https://www.luogu.com.cn/problem/P4556

题意:

给一棵树型村庄,每次给 x到y路径上的村庄发一袋 z 粮食  ,求最后 每个村庄拥有数量最多的粮食种类

思路:

将树看成有根树,取1作为根,每次发放粮食的操作 利用树上差分转化为4次单点发放粮食,直接修改即可,查询数量最多的粮食种类,我们采用 权值线段树 维护每种粮食的数量,建n棵线段树,最后通过 线段树合并+dfs 求出线段树的树上前缀和

代码:

#include<bits/stdc++.h>
using namespace std;#define int long longconst int N=1e5+5;
int head[N],cntt=0;        //建图
struct Edge{int to,next;
}edge[2*N];
void add(int u,int v){edge[++cntt].to=v;edge[cntt].next=head[u];head[u]=cntt;
}int f[N][30],dis[N],n,t;
void init(){                //lcaqueue<int>q;q.push(1);dis[1]=1;while(!q.empty()){int tmp=q.front();q.pop();for(int i=head[tmp];i;i=edge[i].next){int y=edge[i].to;if(dis[y])continue;dis[y]=dis[tmp]+1;f[y][0]=tmp;q.push(y);for(int j=1;j<=t;j++){f[y][j]=f[f[y][j-1]][j-1];}}}
}
int lca(int u,int v){if(dis[u]>dis[v])swap(u,v);for(int i=t;i>=0;i--){if(dis[f[v][i]]>=dis[u])v=f[v][i];}if(u==v)return u;for(int i=t;i>=0;i--){if(f[u][i]!=f[v][i]){u=f[u][i],v=f[v][i];}}return f[u][0];
}#define mid ((l+r)>>1)int X[N],Y[N],Z[N],rt[N],num=0;
int ls[60*N],rs[60*N],cnt[60*N],pos[60*N];void pushup(int p){if(cnt[ls[p]]>cnt[rs[p]]){cnt[p]=cnt[ls[p]];pos[p]=pos[ls[p]];}else if(cnt[rs[p]]>cnt[ls[p]]){cnt[p]=cnt[rs[p]];pos[p]=pos[rs[p]];}else{cnt[p]=cnt[ls[p]];pos[p]=min(pos[ls[p]],pos[rs[p]]);}
}void upd(int &p,int l,int r,int x,int k){if(!p)p=++num;if(l==r){cnt[p]+=k;pos[p]=l;return;}if(x<=mid)upd(ls[p],l,mid,x,k);else upd(rs[p],mid+1,r,x,k);pushup(p);
}int merge(int x,int y,int l,int r){if(!x)return y;if(!y)return x;if(l==r){cnt[x]+=cnt[y];pos[x]=l;return x;}ls[x]=merge(ls[x],ls[y],l,mid);rs[x]=merge(rs[x],rs[y],mid+1,r);pushup(x);return x;
}int ans[N],mx;
void dfs(int x,int ff){for(int i=head[x];i;i=edge[i].next){int y=edge[i].to;if(y==ff)continue;dfs(y,x);rt[x]=merge(rt[x],rt[y],1,mx);}if(cnt[rt[x]])ans[x]=pos[rt[x]];
}void solve(){int m;cin>>n>>m;t=log2(n);for(int i=1;i<n;i++){int u,v;cin>>u>>v;add(u,v);add(v,u);}init();for(int i=1;i<=m;i++){cin>>X[i]>>Y[i]>>Z[i];mx=max(mx,Z[i]);}for(int i=1;i<=m;i++){upd(rt[X[i]],1,mx,Z[i],1);upd(rt[Y[i]],1,mx,Z[i],1);upd(rt[lca(X[i],Y[i])],1,mx,Z[i],-1);if(f[lca(X[i],Y[i])][0])upd(rt[f[lca(X[i],Y[i])][0]],1,mx,Z[i],-1);}dfs(1,1);for(int i=1;i<=n;i++){cout<<ans[i]<<endl;}return;
}signed main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int T=1;while(T--){solve();}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/19143.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端需要知道的计算机网络知识

1 Web 机制 无论通过有线方式 (通常是网线) 还是无线方式&#xff08;比如 wifi 或蓝牙)&#xff0c;通信需要进行连接&#xff0c;网络上的每台计算机需要链接到路由器&#xff08;router&#xff09;。 路由器确保从一台计算机上发出的一条信息可以到达正确的计算机。计算机…

【Android Framework系列】第9章 AMS之Hook实现登录页跳转

1 前言 前面章节我们学习了【Android Framework系列】第5章 AMS启动流程和【Android Framework系列】第6章 AMS原理之Launcher启动流程&#xff0c;大概了解了AMS的原理及启动流程&#xff0c;这一章节我们通过反射和动态代理对不同Android版本下的AMS进行Hook&#xff0c;实现…

一个tomcat部署两个服务的server.xml模板

一个服务的文件夹名字叫hospital&#xff0c;一个服务的文件夹叫ROOT&#xff0c;一个tomcat运行两个服务如何配置呢&#xff1f;注意一个appBase为webapps&#xff0c;另一个appBase为webapps1,当然也可以放在一个webappps里面。 <Service name"Catalina">&l…

几个似非而是的注释问题

C 语言的注释可以出现在 C 语言代码的任何地方。这句话对不对&#xff1f;这是我当学生时我 老师问的一个问题。我当时回答是不对。好&#xff0c;那我们就看看下面的例子&#xff1a; A &#xff09;&#xff0c; int/*...*/i; B &#xff09;&#xff0c; char* s"…

多模块Springboot项目maven单独打包子模块

背景介绍 最近接手一个项目代号XXL&#xff0c;是一个多模块的Springboot项目&#xff0c;在解决了线上的bug之后&#xff0c;想单独给子模块打包上线部署&#xff0c;问题来了。如果整个工程一起mvn -X -DskipTests clean package&#xff0c;打包出来的XXL-web.jar是可以正常…

Andriod开发性能优化实践

文章目录 内存优化布局优化网络优化图片优化内存泄露绘制优化 内存优化 在Android开发中&#xff0c;有一些实践可以帮助进行内存优化&#xff0c;以减少应用程序的内存占用和提高性能。以下是一些常见的内存优化实践&#xff1a; 使用合适的数据结构和集合&#xff1a;选择合…

初学者入门进阶吉他推荐,卡马F1和VEAZEN费森VZ90系列怎么选?详细对比评测,哪一款更符合你的首选!

在新手入门单板吉他圈里&#xff0c;KEPMA卡马F1系列和VEAZEN费森VZ90系列是国内品牌一直都很热销的吉他型号&#xff0c;那么&#xff0c;今天就给大家做一个对比&#xff0c;新手们可以通过各方面评测分析&#xff0c;理性的看看哪把琴适合你买。希望对不知道如何选一把合适吉…

【WebGIS实例】(10)Cesium开场效果(场景、相机旋转,自定义图片底图)

效果 漫游效果视频&#xff1a; 【WebGIS实例】&#xff08;10&#xff09;Cesium开场效果&#xff08;场景、相机 点击鼠标后将停止旋转并正常加载影像底图&#xff1a; 代码 可以直接看代码&#xff0c;注释写得应该比较清楚了&#xff1a; /** Date: 2023-07-28 16:21…

认识 mysql 命令

文章目录 1.简介2.选项3.子命令4.小结参考文献 1.简介 mysql 是 MySQL 的命令行客户端工具&#xff0c;用于连接到 MySQL 服务器并执行 SQL 语句。 它支持交互式和非交互式两种使用方式。以交互方式使用时&#xff0c;查询结果以 ASCII 表格式呈现。 当以非交互方式使用时&am…

使用langchain与你自己的数据对话(三):检索(Retrieval)

之前我已经完成了使用langchain与你自己的数据对话的前两篇博客&#xff0c;还没有阅读这两篇博客的朋友可以先阅读一下&#xff1a; 使用langchain与你自己的数据对话(一)&#xff1a;文档加载与切割使用langchain与你自己的数据对话(二)&#xff1a;向量存储与嵌入 今天我们…

对 Redis 实现分布式事务的探索与实现

对 Redis 实现分布式事务的探索与实现 一、简介简介优势 二、Redis 的事务机制事务WATCH 命令MULTI 命令EXEC 命令UNWATCH 命令 三、Redis 的分布式事务集群架构分布式事务分布式事务实现方式1. 两阶段提交&#xff08;2PC&#xff09;方式Paxos 算法实现方式Raft 算法实现方式…

4.netty源码分析

1.pipeline调用handler的源码 //pipeline得到双向链表的头,next到尾部, 2.心跳源码 主要分析IdleStateHandler3个定时任务内部类 //考虑了网络传输慢导致出站慢的情况 //超时重新发送,然后关闭 ReadTimeoutHandler(继承IdleStateHandler 直接关闭连接)和WriteTimeoutHandler(继…

js如何将图片转成BASE64编码,网页跟uniapp开发的app的区别?

Base64是一种用64个字符来表示任意二进制数据的方法&#xff0c;这篇文章主要为大家介绍了如何实现将图片转为base64格式&#xff0c;感兴趣的小伙伴可以学习一下 前言 前段时间在写我的VUE全栈项目的时候&#xff0c;遇到要把前端的照片上传到后端&#xff0c;再由后端存到数…

SpringBoot项目中使用Lombok插件中Slf4j日志框架

前言&#xff1a;idea需要安装lombok插件&#xff0c;因为该插件中添加了Slf4j注解&#xff0c;可以将Slf4j翻译成 private static final org.slf4j.Logger logger LoggerFactory.getLogger(this.XXX.class); springboot本身就内置了slf4j日志框架&#xff0c;所以不需要单独…

【2023】Redis实现消息队列的方式汇总以及代码实现

Redis实现消息队列的方式汇总以及代码实现 前言开始前准备1、添加依赖2、添加配置的Bean 具体实现一、从最简单的开始&#xff1a;List 队列代码实现 二、发布订阅模式&#xff1a;Pub/Sub1、使用RedisMessageListenerContainer实现订阅2、还可以使用redisTemplate实现订阅 三、…

小白到运维工程师自学之路 第六十二集 (docker持久化与数据卷容器)

一、概述 Docker持久化是指将容器中的数据持久保存在主机上&#xff0c;以便在容器重新启动或迁移时不丢失数据。由于Docker容器是临时和可变的&#xff0c;它们的文件系统默认是易失的&#xff0c;这意味着容器中的任何更改或创建的文件都只存在于此容器的生命周期内。但是&a…

小主机折腾记16

7月折腾了 1.2500s&#xff0c;2550k&#xff0c;e3 1225的性能测试 结果如下图 总结如下&#xff1a; a.2500s e3 1225 2390t 差别不大 b.1333频率相对1066频率内存提升12%左右 c.为什么少了2550k&#xff0c;因为装上去风扇尬转&#xff0c;没画面&#xff0c;我猜是因为…

node.js判断元素是否包括

在Node.js中&#xff0c;可以使用Array.prototype.some()方法来判断数组中是否包含某个元素。下面是一个示例代码&#xff1a; const arr [ { ‘_android:name’: ‘com.eg.android.AlipayGphone’ }, { ‘_android:name’: ‘com.eg.android.AlipayGphoneRC’ }, { ‘_andro…

助力青少年科技创新人才培养,猿辅导投资1亿元设立新基金

近日&#xff0c;在日本千叶县举办的2023年第64届国际数学奥林匹克&#xff08;IMO&#xff09;竞赛公布比赛结果&#xff0c;中国队连续5年获得团体第一。奖牌榜显示&#xff0c;代表中国参赛的6名队员全部获得金牌。其中&#xff0c;猿辅导学员王淳稷、孙启傲分别以42分、39分…

用latex的ACM模板写论文如何去除页眉页脚以及Reference

简单粗暴如下&#xff1a; 1、latex最开始补充&#xff1a; \documentclass[acmsmall]{acmart} \settopmatter{printacmreffalse} % Removes citation information below abstract \renewcommand\footnotetextcopyrightpermission[1]{} % removes footnote with conference in…