码蹄集部分题目(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&#…

pytorch学习(十四)层结构容器

本篇文章列举了nn.Sequential&#xff0c;nn.ModuleList&#xff0c;nn.ModuleDict三个容器的使用方法&#xff0c;并且还学习了一种使用类封装模块的方法。通过本篇博客的学习&#xff0c;你将学习到三个容器和使用类构建容易的方法。 1.nn.Sequential 第一种方法直接列出每…

linux shell(上)

几个常用的shell命令 file 命令是一个方便的小工具&#xff0c;能够探测文件的内部并判断文件类型 file .bashrc # 检查文件 file Document # 检查目录df命令可以方便地查看所有已挂载磁盘的使用情况 du 命令可以显示某个特定目录&#xff08;默认情况下是当前目录&#xff0…

大模型涉及到的知识点

1. 基础数学和统计学 **线性代数&#xff1a;**矩阵运算、特征值与特征向量、奇异值分解等。 **微积分&#xff1a;**导数和积分、链式法则、梯度下降法等。 **概率与统计&#xff1a;**概率分布、期望与方差、最大似然估计、贝叶斯定理等。 2. 机器学习基础 监督学习&#xf…

【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的功能、技术原理…

十、继承

十、继承 继承的基本概念使用继承的原因继承的用途继承的注意事项继承的基本使用定义基类定义派生类使用派生类的对象注意事项示例&#xff1a;构造函数和析构函数的调用 继承基本规则继承方式注意事项示例 赋值兼容原则继承中的同名成员成员变量成员函数总结 继承中的静态成员…

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

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

【hadoop大数据集群 1】

hadoop大数据集群 1 文章目录 hadoop大数据集群 1一、环境配置1.安装虚拟机2.换源3.安装工具4.安装JDK5.安装Hadoop 一、环境配置 折腾了一下午/(ㄒoㄒ)/~~ 1.安装虚拟机 参考视频&#xff1a;https://www.bilibili.com/video/BV18y4y1G7JA?p17&vd_sourcee15e83ac6b22a…

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

vue中怎么改变状态值?

在Vue中&#xff0c;状态值通常指的是组件的data函数返回的对象中的属性&#xff0c;或者是Vuex状态管理库中的状态。以下是在Vue中改变状态值的几种常见方法&#xff1a; 1. 直接在组件内部改变状态值 在Vue组件中&#xff0c;你可以直接在methods中改变data函数返回的对象中…

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;可提高速率、延迟等方面的性能。那么它们之间到…

装修前需要提前准备啥

雅静说装修前自备15材料,才不会手慌脚乱      省的师父用的时候我们还得着急到处跑,关键质量和价格还没得选      1,保护膜,一开工就把入户门,电梯口的墙都包好      不然装完就像这样,磕碰的到处是口子      2,钥匙密码盒,有时候上班我们不在,师父或送材料的一…

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

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