码蹄集部分题目(2024OJ赛7.17-7.21;并查集+最小生成树+线段树+树状数组+DP)

1🐋🐋供水管线(钻石;并查集+最小生成树)

时间限制:1秒

占用内存:128M

🐟题目思路

该题目就是最小生成树的问题。我们使用选边的方法,每次选取最小边加入,用并查集检查是否已联通,如果已联通又加入该边就会产生环,是错误的,详见代码。

【码蹄集进阶塔全题解13】数据结构:并查集/线段树/树状数组 MT2137 – MT2143_哔哩哔哩_bilibili

🐟代码

#include<bits/stdc++.h> 
​
using namespace std;
struct edge
{int i,j,c;bool operator<(const edge &t) const {return c<t.c;}
}p[200];
int n,k,par[200];
​
int find(int x)
{if(x==par[x]) return x;return par[x]=find(par[x]);
}
​
bool merge(int i,int j)
{int x=find(i),y=find(j);if(x!=y) par[x]=y;else return false;return true;
}
​
int main( )
{cin>>n>>k;for(int i=1;i<=n;i++) par[i]=i;int x,y,c,ans=0;for(int i=1;i<=k;i++) cin>>p[i].i>>p[i].j>>p[i].c;sort(p+1,p+1+k);for(int i=1;i<=k;i++){bool ok=merge(p[i].i,p[i].j);//使用并查集判断连通性if(ok==true) ans+=p[i].c;}cout<<ans;return 0;
}

2🌼🐋🐋逆序(钻石;树状数组)

时间限制:1秒

占用内存:128M

🐟题目思路

record:一个数是record就意味着他前边的数都比他小

树状数组可以求前边有多少个数比我小

【码蹄集进阶塔全题解13】数据结构:并查集/线段树/树状数组 MT2137 – MT2143_哔哩哔哩_bilibili

🥪“树状数组”知识点补充

简介

树状数组,就是一个结构为树形结构的数组,不同于二叉树的结构,它在二叉树的结构上删除了一些中间节点:

二叉树:

树状数组:

应用场景

可以解决大部分区间上面的修改以及查询的问题,例如1.单点修改,单点查询,2.区间修改,单点查询,3.区间查询,区间修改,换言之,线段树能解决的问题,树状数组大部分也可以,但是并不一定都能解决,因为线段树的扩展性比树状数组要强;树状数组的作用就是为了简化线段树。

详细讲解
前置知识—lowbit(x)运算

如何计算一个非负整数n在二进制下的最低为1及其后面的0构成的数? 例如:44 = (101100) 2,最低为1和后面的0构成的数是 (100) 2 = 4 所以 lowbit (44) = lowbit((101100)2) = (100)2 = 4,那么lowbit运算时怎么实现的呢?

44的二进制=(101100),我们对44的二进制数取反+1(也就是44的二进制补码),也即~44+1,得到-44

-44的二进制=(010100),然后我们把44和-44的二进制进行按位与运算,也即按位&得到,二进制000100,也就是十进制的4

所以lowbit(x) = x&(-x)

1问题引入

2接下来分析树状数组原理

上面是树状数组的结构图,t[x]保存以x为根的子树中叶子节点值的和,原数组为a[],那么原数组前4项的和t[4]=t[2]+t[3]+a[4]=t[1]+a[2]+t[3]+a[4]=a[1]+a[2]+a[3]+a[4]

观察节点的二进制数,可以发现,树状数组中节点x的父节点为x+lowbit(x),例如t[2]的父节点为t[4]=t[2+lowbit(2)]

3单点修改,区间查询

所以在进行单点修改的同时,更新父节点就变得非常简单,例如我们对a[1]+k,那么祖先节点t[1],t[2],t[4],t[8]都需要+k更新(因为t[]表示前缀和),此时我们就可以用lowbit操作实现.

int add(int x,int k)
{for(int i=x;i<=n;i+=lowbit(i))t[i]+=k;
}

单点修改实现了,如何实现区间查询呢? 例如:我们需要查询前7项的区间和sum[7]

通过图中不难看出,sum[7]=t[7]+t[6]+t[4] ,我们进一步发现,6=7-lowbit(7),4=6-lowbit(6),所以我们可以通过不断的-lowbit操作来实现求和

int ask(x){int sum = 0;for(int i=x;i;i-=lowbit(i)){sum+=t[i];}return sum;
}

这只能求区间[1,x]的区间和,那么如何求[L,R]的区间和呢? 这时候利用前缀和相减的性质就可以了[L,R]=[1,R]−[1,L−1]

int search(int L,int R)
{int ans = 0;for(int i=L-1;i;i-=lowbit(i))ans-=c[i];for(int i=R;i;i-=lowbit(i))ans+=c[i];return 0;
}

(摘自:树状数组(详细分析+应用),看不懂打死我!-CSDN博客)

🐟代码

#include<bits/stdc++.h> 
​
using namespace std;
const int N=1e5+5;
int n,c[N],chg[N];//chg[x]=y表示将x删掉后record会增加y个,那么chg数组中的最大值就是我们要的结果
​
int lowbit(int x) {return x & -x;}
void add(int x)
{for(;x<N;x+=lowbit(x)) c[x]++;
}
int sum(int x)
{int ret=0;for(;x>0;x-=lowbit(x)) ret+=c[x];return ret;
}
​
int main( )
{cin>>n;int x=0,maxm=0;for(int i=1;i<=n;i++){cin>>x;maxm=max(maxm,x);int cnt=sum(x);//计算前边有多少个数比X小if(cnt==i-1) chg[maxm]--;//对第i个数来说,前边有i-1个数比我小,满足record;那么如果把我删掉,反而少了一个record,就要减一else if(cnt==i-2) chg[maxm]++;//这说明前边有1个数比我大,如果把那个数删掉,就能多一个record//只用考虑这两种情况,因为i-3的情况下,删除一个就也无法变成record,无能为力了,往后亦是如此add(x);}int ans=1;for(int i=1;i<=n;i++){if(chg[i]>chg[ans]) ans=i;}cout<<ans;return 0;
}

3🌼🐋🐋线段树(钻石;线段树)

时间限制:1秒

占用内存:128M

🐟题目思路

线段树模板题

【码蹄集进阶塔全题解13】数据结构:并查集/线段树/树状数组 MT2137 – MT2143_哔哩哔哩_bilibili

🐟代码

#include<bits/stdc++.h> 
​
using namespace std;
const int N=1e5+5;
#define int long long
struct node
{int l,r,val,lz;//lz是懒标记
}tree[4*N];
int a[N];
​
void build(int p,int l,int r)
{tree[p].l=l,tree[p].r=r;if(l==r){tree[p].val=a[l];return;}int mid=(l+r)/2;build(p*2,l,mid);build(p*2+1,mid+1,r);tree[p].val=tree[p*2].val+tree[p*2+1].val;
}
​
void lazy(int p,int v)
{int s=tree[p].l,t=tree[p].r;tree[p].val+=(t-s+1)*v,tree[p].lz+=v;
}
​
void pushdown(int p)
{lazy(2*p,tree[p].lz);lazy(2*p+1,tree[p].lz);tree[p].lz=0;
}
//带懒标记区间修改,[l,r]
//为修改区间,p为当前节点编号,c为区间节点变化值,求和非求最值
void update(int l,int r,int c,int p)
{int s=tree[p].l,t=tree[p].r;if(l<=s&&t<=r) return lazy(p,c);if(tree[p].lz&&s!=t) pushdown(p);int mid=(s+t)/2;if(l<=mid) update(l,r,c,p*2);if(r>mid) update(l,r,c,p*2+1);tree[p].val=tree[p*2].val+tree[p*2+1].val;
}
//带懒标记区间查询(区间求和),[l,r]为修改区间,p为当前节点编号
int query(int l,int r,int p)
{int s=tree[p].l,t=tree[p].r;if(l<=s&&t<=r) return tree[p].val;if(tree[p].lz) pushdown(p);int mid=(s+t)/2,sum=0;if(l<=mid) sum=query(l,r,p*2);if(r>mid) sum+=query(l,r,p*2+1);return sum;
}
​
signed main( )
{int n,m;cin>>n>>m;for(int i=1;i<=n;i++) cin>>a[i];build(1,1,n);while(m--){int op,x,y,k;cin>>op;if(op==1){cin>>x>>y>>k;update(x,y,k,1);}else {cin>>x>>y;cout<<query(x,y,1)<<endl;}}return 0;
}

4🌼🐋🐋快排变形(黄金;树状数组)

时间限制:1秒

占用内存:128M

🐟题目思路

树状数组经典应用:求逆序对个数,使用归并排序

【码蹄集进阶塔全题解13】数据结构:并查集/线段树/树状数组 MT2137 – MT2143_哔哩哔哩_bilibili

🐟代码

#include<bits/stdc++.h> 
​
using namespace std;
const int N=2e5+5;
int n,a[N],b[N],c[N];
long long ans;
​
int lowbit(int x) {return x & -x;}
void add(int i,int x)
{for(;i<=n;i+=lowbit(i)) c[i]+=x;
}
int sum(int i)
{int ans=0;for(;i>0;i-=lowbit(i)) ans+=c[i];return ans;
}
bool cmp(const int x,const int y)
{if(b[x]==b[y]) return x>y;return b[x]>b[y];
}
​
int main( )
{cin>>n;for(int i=1;i<=n;i++){cin>>b[i];a[i]=i;}sort(a+1,a+n+1,cmp);for(int i=1;i<=n;i++){add(a[i],1);ans+=sum(a[i]-1);}cout<<ans;return 0;
}

5🐋🐋上楼梯(黄金;线性DP)

时间限制:1秒

占用内存:128M

🐟题目思路

经典DP题,这道题目无需考虑层级之间的问题,直接使用动态转移方程:dp[n]=dp[n-1]+dp[n-2]即可,dp数组中存放到达第n层共有多少种方案。

【码蹄集进阶塔全题解14】动态规划:MT2144 – MT2150_哔哩哔哩_bilibili

🐟代码

#include<bits/stdc++.h> 
​
using namespace std;
int n,m;
long long dp[100];//注意,int会报错
int main( )
{cin>>m>>n;int total=(n-1)*m;dp[1]=1;dp[2]=2;for(int i=3;i<=total;i++) dp[i]=dp[i-1]+dp[i-2];cout<<dp[total];return 0;
}

6🐋🐋上楼梯2(黄金;线性DP)

时间限制:1秒

占用内存:128M

🐟题目思路

状态转移方程:dp[n]=dp[n-1]+dp[n-2]+……+dp[n-k]

【码蹄集进阶塔全题解14】动态规划:MT2144 – MT2150_哔哩哔哩_bilibili

🐟代码

#include<bits/stdc++.h> 
​
using namespace std;
const int N=1e5+5;
int n,k;
long long dp[N];
int main( )
{cin>>n>>k;dp[0]=dp[1]=1;for(int i=2;i<=k;i++){for(int j=1;j<=i;j++) dp[i]=(dp[i]+dp[i-j])%114584;}for(int i=k+1;i<=n;i++){for(int j=1;j<=k;j++) dp[i]=(dp[i]+dp[i-j])%114584;}cout<<dp[n];return 0;
}

⭐创作不易,点个赞吧~

⭐点赞收藏不迷路~

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

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

相关文章

Kettle 登录示例 POST请求

登录接口是post请求&#xff0c;组装Body为json字符串 var body "{\"username\":\""username"\",\"password\": \""password"\",\"code\":\""verification"\",\"uuid\…

小阿轩yx-高性能内存对象缓存

小阿轩yx-高性能内存对象缓存 案例分析 案例概述 Memcached 是一款开源的高性能分布式内存对象缓存系统用于很多网站提高访问速度&#xff0c;尤其是需要频繁访问数据的大型网站是典型的 C/S 架构&#xff0c;需要构建 Memcached 服务器端与 Memcached API 客户端用 C 语言…

【C++】内存管理的深度解析与实例

C内存管理的深度解析与实例 一、C内存管理的基本概念二、C内存分配方式1. 静态内存分配2. 动态内存分配 三、C内存管理的常见问题及解决策略1. 内存泄漏2. 堆内存碎片化3. 栈溢出 四、C内存管理的最佳实践1. 使用RAII&#xff08;Resource Acquisition Is Initialization&#…

【BUG】已解决:python setup.py bdist_wheel did not run successfully.

已解决&#xff1a;python setup.py bdist_wheel did not run successfully. 目录 已解决&#xff1a;python setup.py bdist_wheel did not run successfully. 【常见模块错误】 解决办法&#xff1a; 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主…

在Django项目中创建Django App

进入code虚拟环境 .\.venv\Scripts\activate创建demoapp python demo/manage.py startapp demoapp

Neuralink首款产品Telepathy:意念控制设备的革新与挑战

近年来&#xff0c;科技领域不断涌现出令人惊叹的突破&#xff0c;其中尤以脑机接口&#xff08;BCI&#xff09;技术为代表。近日&#xff0c;Elon Musk的Neuralink公司发布了其首款脑机接口产品Telepathy&#xff0c;引发了广泛关注。本文将详细探讨Telepathy的功能、技术原理…

PCIe总线-RK3588 PCIe平台驱动分析(十)

1.简介 RK3588 PCIe RC和EP使用同一个平台驱动&#xff0c;其主要的作用是解析设备树中的资源、初始化中断、使能电源、初始化PHY、使能时钟和释放复位&#xff0c;然后根据compatible属性初始化RC或者EP驱动。 2.入口 平台驱动的定义如下&#xff0c;当compatible属性为&qu…

C语言:静态库和动态(共享)库

相关阅读 C语言https://blog.csdn.net/weixin_45791458/category_12423166.html?spm1001.2014.3001.5482 在软件开发中&#xff0c;库&#xff08;Library&#xff09;是一个至关重要的概念。它们是由函数和数据的集合构成&#xff0c;用于实现特定的功能&#xff0c;供其他程…

使用Vuepress搭建个人网站

网站地址&#xff1a;bloggo.chat

MySQL学习作业二

作业描述 SQL语言 建库&#xff0c;使用库 mysql> create database mydb8_worker;#新建库mysql> use mydb8_worker; 建表&#xff0c;查看表 #建表 mysql> create table t_worker(department_id int(11) not null comment部门号,worker_id int(11) primary key no…

无人机足球比赛技术详解

一、无人机类型参数 在无人机比赛中&#xff0c;不同类型的无人机因其独特的参数配置而表现出不同的性能。这些参数包括但不限于&#xff1a; 1. 机体尺寸&#xff1a;小型无人机适合室内或狭窄空间比赛&#xff0c;而大型无人机则更适用于室外大场地赛事。 2. 动力系统&…

动态路由协议 —— EIGRP 与 OSPF 的区别

EIGRP&#xff08;增强内部网关路由协议&#xff09;和 OSPF&#xff08;开放式最短路径优先&#xff09;是两种最常见的动态路由协议&#xff0c;主要是用来指定路由器或交换机之间如何通信。将其应用于不同的情况下&#xff0c;可提高速率、延迟等方面的性能。那么它们之间到…

IO多路复用-select的使用详解【C语言】

1.多进程/线程并发和IO多路复用的对比 IO多路转接也称为IO多路复用&#xff0c;它是一种网络通信的手段&#xff08;机制&#xff09;&#xff0c;通过这种方式可以同时监测多个文件描述符并且这个过程是阻塞的&#xff0c;一旦检测到有文件描述符就绪&#xff08; 可以读数据…

【数据结构进阶】二叉搜索树

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a; C || 数据结构 目录 &#x1f308;前言&#x1f525;二叉搜索树&#x1f525; 二叉搜索树的实现Insert&#xff08;插入&#xff09;find&#xff08;查找&#xff09;erase(删除)destro…

分布式锁、Lua脚本、redisson、运行lua脚本优化代码

20240721 一、分布式锁1. 什么是分布式锁2. 分布式锁的实现3. 基于redis的分布式锁4 总结 二、对于lua脚本可以保证事务&#xff0c;要么成功要么失败。1. 在redis中调用lua脚本 三、Redisson1 步骤2. Redisson的总结3. 几种分布式锁的区别 三、优化我们的秒杀1. 我们在创建优惠…

Docker安装笔记

1. Mac安装Docker 1.1 Docker安装包下载 1.1.1 阿里云 对于10.10.3以下的用户 推荐使用 对于10.10.3以上的用户 推荐使用 1.1.2 官网下载 系统和芯片选择适合自己的安装包 1.2 镜像加速 【推荐】阿里镜像 登陆后&#xff0c;左侧菜单选中镜像加速器就可以看到你的专属地…

windows和linux的等保加固测评的经验分享

一头等保加固测评的牛马&#xff0c;需要能做到一下午测评n个服务器 接下来就讲讲如何当一头xxxxxxxxx》严肃的等保测评加固的经验分享&#xff08; 一、window等保 首先你要自己按着教程在虚拟机做过一遍&#xff08;win2012和win2008都做过一遍&#xff0c;大概windows的…

pico+unity3d 射线交互教程

前期配置&#xff1a;环境配置参考教程一&#xff0c;手部模型参考教程二&#xff0c;场景基于上一篇搭建。 最终效果&#xff1a;手部射线&#xff08;初始不可见&#xff09;对准 UI 显示&#xff0c;按下手柄 Trigger 键与可交互 UI&#xff08;如 Button、Toggle、Slider …

论文解读 | ICML2024:突破Transformer上下文学习中的瓶颈

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 作者简介 付靖文&#xff0c;西安交通大学博士生 简介 上下文学习&#xff0c;即从上下文示例中学习&#xff0c;是Transformer一项令人印象深刻的能力。然而&#xff0c;由于学习瓶颈的出现——在训练过程中模…

移动UI:任务中心的作用,该如何设计更合理?

任务中心是移动应用中用于展示和管理用户待办任务、提醒事项、用户福利、打卡签到等内容的功能模块。合理设计任务中心可以提升用户体验和工作效率。 以下是一些设计任务中心的合理建议&#xff1a; 1. 易于查看和管理&#xff1a; 任务中心的设计应该使用户能够快速、直观地…