洛谷:集合与前缀和

1.亲戚(并查集)

#include<iostream>
using namespace std;
int n,m,p;
int m1,m2,p1,p2;
int f[5005];int find(int x)//查询根节点,根节点的标志是根节点的父节点是自己
{if(f[x]!=x)f[x]=find(f[x]);//路径压缩,父节点变为根节点,方便下次询问return f[x];
}
void combine(int a,int b)
{f[find(a)]=find(b);
}
int main()
{cin>>n>>m>>p;for(int i=1;i<=n;i++)f[i]=i;//先让每个节点的父节点是自己for(int i=1;i<=m;i++){cin>>m1>>m2;combine(m1,m2);//是两个集合的合并,让一个集合的根节点的父节点等于另外一个集合的根节点}for(int i=1;i<=p;i++)  {cin>>p1>>p2;if(find(p1)==find(p2))cout<<"Yes"<<endl;else cout<<"No"<<endl;}

        从题目中来看,这是一对一对的亲戚关系,具有亲戚关系的是一个集合,如果两个集合中有同一个人,说明另外两个人也有亲戚关系,那他们就应该合并这两个集合,这不就是并查集支持的操作吗?我们定义一个父节点数组表示i节点的父节点,先让每个节点的父节点是自己,当两个人是亲戚时,我们就合并两个集合,让一个集合的根节点的父节点等于另外一个集合的根节点,循环结束后,具有亲戚关系的都在同一个集合里,如果两个人所在集合的根节点是相同的,这两个人就是亲戚,否则不是。

2.团伙(并查集)

#include<iostream>
using namespace std;
int n,m,p,q,f[100010],cnt=0;
int rsp[1010][1010];//定义一个二维数组表示两个人是否是敌人
char opt;
int find(int x)
{if(f[x]!=x) f[x]=find(f[x]);return f[x];
}
void combine(int a,int b)
{f[find(a)]=find(b);
}
int main()
{cin>>n>>m;for(int i=1;i<=n;i++)f[i]=i;for(int i=1;i<=m;i++){cin>>opt>>p>>q;if(opt=='F')combine(p,q),cnt++;else if(opt=='E'){rsp[p][q]=rsp[q][p]=1;for(int j=1;j<=n;j++){if(rsp[q][j]==1)combine(p,j),cnt++;if(rsp[p][j]==1)combine(q,j),cnt++;}} }cout<<cnt;return 0;
}

     这道题其实和上一道是基本上一样的,唯一不同的是这道题当两个人是敌人的时候我们怎么进行记录,是朋友就把把两个集合合并,如果是敌人,我们定义一个二维数组,如果p和q是敌人,则rsp[p][q]=rsp[q][p]=1,表示两个人是敌人, 当我们遍历时,如果q和j或者p和j是敌人,那p和j或者q和j就是朋友,合并两个集合即可,最后统计出有多少个集合,返回cnt。

3.字符串哈希(哈希表)

#include<iostream>
#include<set>
using namespace std;
set<string>word;
int n,cnt;
string str;
int main()
{cin>>n;while(n--){cin>>str;word.insert(str);}for(set<string>::iterator it=word.begin();it!=word.end();it++)cnt++;//begin函数返回第一个元素的迭代器cout<<cnt;}

     这道题是模板题,题目要求统计不重复的不同字符串的个数,我们不仅要知道有多少字符串,还要去重,有什么数据结构能帮我们呢?那必然是哈希表set啊,自带去重功能,多好的STL,我们只需要不断执行insert插入操作,最后遍历统计集合内有多少字符串就可以啦。

4.阅读理解(map和set)

#include<iostream>
#include<set>
#include<map>
#include<string>
using namespace std;
map<string,set<int>>mp;
int n,l,m;
string word,s;
int main()
{cin>>n;for(int i=1;i<=n;i++){cin>>l;while(l--){cin>>word;mp[word].insert(i);}}cin>>m;while(m--){cin>>s;if(mp.count(s)){for(set<int>::iterator it=mp[s].begin();it!=mp[s].end();it++){cout<<*it<<" ";}}cout<<endl;}return 0;
}

     这道题对我这种菜鸡来说还是有点难的,首先我们要存储字符串,还要存储字符串的每个单词在哪篇文章出现过,诶,这不是关键字和值的键值对吗?给一个单词,我们就知道它在哪篇文章出现过,而且还不只一篇文章,对应的值是一个集合,那我们的思路就很清晰了。

     定义一个map,关键字是字符串,也就是单词,值是出现该单词的文章的编号,因为不只一个,是集合,所以定义了一个set集合,之后就是把单词和对应的文章编号不断地插入。插入完成之后,我们就要开始询问了,you这个单词在哪篇文章出现过啊?如果mp.count(you)不等于0,说明存在,那我们就开始遍历mp[you]对应的set集合,输出对应的值即可。

5.求区间和(一维前缀和)

#include<iostream>
using namespace std;
int sum[100010];
int ans[100010];
int a,m,l,r;
int main()
{int n;cin>>n;for(int i=1;i<=n;i++){cin>>a;ans[i]=a;}sum[0]=0;for(int i=1;i<=n;i++)//求前缀和{sum[i]=sum[i-1]+ans[i];}cin>>m;for(int i=1;i<=m;i++)//用前缀和求区间和{cin>>l>>r;cout<<sum[r]-sum[l-1]<<endl;}return 0;
}

      这道题也是模板题,先求前缀和,再用前缀和求区间和。

6.最大加权矩形(二维前缀和)

#include<iostream>
using namespace std;
int sum[120][120];
int num[120][120];
int n,m,maxn,s;
int main()
{cin>>n;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){  cin>>m;num[i][j]=m;}}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){  sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+num[i][j];//求二维前缀和}} maxn=sum[1][1];for(int i=1;i<=n;i++)
{for(int j=1;j<=n;j++){for(int p=i;p<=n;p++){for(int q=j;q<=n;q++){s=sum[p][q]-sum[i-1][q]-sum[p][j-1]+sum[i-1][j-1];//求哪个区间最大maxn=max(maxn,s);}}}
}
cout<<maxn;
return 0;
}

     这道题是求二维前缀和,对应的方法在代码里面标注了,求完二维前缀和后,我们就要开始遍历,求左上角坐标为(i,j)、右下角坐标为(p,q)的矩形的权值,我们可以把每一个点看作是一个方格,这样会更好理解一些,之后就是不断进行比较,最后输出最大值。

7.领地选择(矩形面积固定的二维前缀和)

#include<iostream>
#include<vector>
using namespace std;
int n,m,c,a,s;
int maxn=-0x7fffffff;//一定要初始化一个非常小的值,不然会WA
int x,y;
int sum[1010][1010];
int num[1010][1010];
int main()
{cin>>n>>m>>c;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>a;num[i][j]=a;}}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+num[i][j];}}for(int i=c;i<=n;i++){for(int j=c;j<=m;j++){int s=sum[i][j]-sum[i][j-c]-sum[i-c][j]+sum[i-c][j-c];maxn=max(maxn,s);if(maxn==s)x=i-c+1,y=j-c+1;//最后要加1,是坑!}}cout<<x<<" "<<y;return 0;}

     这道题也是二维前缀和,不同的是这个题要求矩形的面积是固定的,所以代码略有不同,要保证矩形面积是c^2。 

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

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

相关文章

Python 简易图形界面库easygui 对话框大全(续)

目录 EasyGUI库 主要特点 使用场景 对话框样式 10. 文件打开框 fileopenbox 11. 文件保存框 filesavebox 12. 目录打开框 diropenbox 13. 索引对话框 indexbox 14. 例外报告框 exceptionbox 15. 代码文本框 codebox 16. 密码输入框 passwordbox 17. 多重文本框 mul…

MySql数据库(3)——DML

一、DML DML&#xff08;Data Manipulation Language&#xff09;数据操作语言&#xff0c;常用语句&#xff1a; insert&#xff1a;输入delete&#xff1a;删除update&#xff1a;修改 插入数据 方式一&#xff1a;insert into 表名 &#xff08;列1&#xff0c;列2……&a…

jmeter之beanshell使用:常用变量汇总

1.变量--日期 使用场景&#xff1a;当入参日期是变量&#xff0c;取当前日期 使用如下&#xff1a; &#xff08;1&#xff09;当前日期 import java.text.SimpleDateFormat; import java.util.Date;// 创建 SimpleDateFormat 对象并指定日期格式 SimpleDateFormat dateFor…

价格成谜,小米汽车到底要卖给谁?

文&#xff5c;刘俊宏 编&#xff5c;王一粟 “不要再讲9.9万了&#xff0c;不可能的&#xff0c;也不要再讲14.9万&#xff0c;小米SU7是有理由的贵”&#xff0c;小米集团创始人、董事长雷军在12月28日的小米汽车技术发布会上&#xff0c;把价格作为最大的悬念留给了市场。…

【Python排序算法系列】—— 选择排序

​ &#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 &#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 选择排序 过程演示&#xff1a; 选择排序实现代码&#xff1a; 分析选择排序&#xff1a…

Grafana无法发送告警消息的飞书webhook(机器人)

1.问题描述 Grafana无法向飞书机器人发送报警消息&#xff0c;实测使用Grafana自带的webhook也不好使&#xff0c;对于用飞书办公的程序猿非常不便&#xff0c;后来发现一个报警神器&#xff0c;开源免费&#xff0c;关键是好用 PrometheusAlert 2.PrometheusAlert安装 Prom…

【办公软件】Excel双坐标轴图表

在工作中整理测试数据&#xff0c;往往需要一个图表展示两个差异较大的指标。比如共有三个数据&#xff0c;其中两个是要进行对比的温度值&#xff0c;另一个指标是两个温度的差值&#xff0c;这个差值可能很小。 举个实际的例子&#xff1a;数据如下所示&#xff0c;NTC检测温…

openGauss学习笔记-178 openGauss 数据库运维-逻辑复制-逻辑解码-使用SQL函数接口进行逻辑解码

文章目录 openGauss学习笔记-178 openGauss 数据库运维-逻辑复制-逻辑解码-使用SQL函数接口进行逻辑解码178.1 前提条件178.2 操作步骤 openGauss学习笔记-178 openGauss 数据库运维-逻辑复制-逻辑解码-使用SQL函数接口进行逻辑解码 openGauss可以通过调用SQL函数&#xff0c;…

医院绩效考核系统源码,java源码,商业级医院绩效核算系统源码

医院绩效定义&#xff1a; “医院工作量绩效方案”是一套以工作量&#xff08;RBRVS&#xff0c;相对价值比率&#xff09;为核算基础&#xff0c;以工作岗位、技术含量、风险程度、服务数量等业绩为主要依据&#xff0c;以工作效率和效益、工作质量、患者满意度等指标为综合考…

WPF 漂亮长方体、正文体简单实现方法 Path实现长方体 正方体方案 WPF快速实现长方体、正方体的方法源代码

这段XAML代码在WPF中实现了一个类似长方体视觉效果的图形 声明式绘制&#xff1a;通过Path、PathGeometry和PathFigure等元素组合&#xff0c;能够以声明方式精确描述长方体每个面的位置和形状&#xff0c;无需编写复杂的绘图逻辑&#xff0c;清晰直观。 层次结构与ZIndex控制…

EyouCMSv1.5.1漏洞复现

赞赞网络科技 EyouCMS&#xff08;易优CMS&#xff09;是中国赞赞网络科技公司的一套基于ThinkPHP的开源内容管理系统&#xff08;CMS&#xff09;。 Eyoucms v1.5.1 及以前版本存在任意用户后台登陆与文件包含漏洞&#xff0c;该漏洞使攻击者可以通过调用api&#xff0c;在前台…

MAC运行Windows专用软件 CrossOver v23.7.1中文版 macOS

CrossOver v23.7.1中文版是一款系统兼容软件&#xff0c;让您可以在 Mac 和 Linux 系统上运行 Windows 应用&#xff0c;不必购买 Windows 授权&#xff0c;不必重启系统&#xff0c;不必使用虚拟机。通过 CrossOver&#xff0c; 您可以从 dock 直接启动 Windows 应用&#xff…

D1671 75Ω视频放大驱动芯片 ,2.8~5.5V 应用于手持设备中 内 置 SAG端 子 6dB放 大 器 电 路

D1671 是 一 块 带 4 级 低 通 滤 波 的 单 通 道 视 频 放 大 电 路 &#xff0c; 可 在 3V 或 5V的 低 电 压 下 工 作 。 该 电 路 用 在 有 TV 影 象 输 出 功 能 的 产 品 上 面 &#xff0c; 比 如 机 顶 盒 &#xff0c;监 控 摄 象 头 &#xff0c;DVD &#xff1b;此 …

D9741 PWM控制器电路,定时闩锁、短路保护电路,输出基准电压(2.5V) 采用SOP16封装

D9741是一块脉宽调制方三用于也收路像机和笔记本电的等设备上的直流转换器。在便携式的仪器设备上。 主要特点&#xff1a;● 高精度基准电路 ● 定时闩锁、短路保护电路 ● 低电压输入时误操作保护电路 ● 输出基准电…

计量经济学|学习笔记以及学习感悟

初级计量经济学着重于介绍基本的统计工具和经济模型&#xff0c;以帮助理解经济数据和经济现象之间的关系。它包括回归分析、假设检验和预测方法等内容。中级计量经济学则深入研究这些方法的理论基础和实际应用&#xff0c;包括更复杂的模型和技术&#xff0c;如面板数据分析、…

web三层架构

目录 1.什么是三层架构 2.运用三层架构的目的 2.1规范代码 2.2解耦 2.3代码的复用和劳动成本的减少 3.各个层次的任务 3.1web层&#xff08;表现层) 3.2service 层(业务逻辑层) 3.3dao 持久层(数据访问层) 4.结合mybatis简单实例演示 1.什么是三层架构 三层架构就是把…

在VMware安装CentOS 7:详细教程

安装准备工作 本地虚拟机&#xff1a;我这里使用的是VMware Workstation 17 Pro centos7系统ISO镜像&#xff1a;我这里使用的是CentOS-7-x86_64-DVD-2009.iso&#xff0c;具体的下载地址是在阿里云官方镜像站&#xff1a;centos-7.9.2009-isos-x86_64安装包下载_开源镜像站-阿…

java设计模式学习之【模板方法模式】

文章目录 引言模板方法模式简介定义与用途实现方式 使用场景优势与劣势在Spring框架中的应用游戏设计示例代码地址 引言 设想你正在准备一顿晚餐&#xff0c;无论你想做意大利面、披萨还是沙拉&#xff0c;制作过程中都有一些共同的步骤&#xff1a;准备原料、加工食物、摆盘。…

力扣题目学习笔记(OC + Swift)25. K 个一组翻转链表

K 个一组翻转链表 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改…

年薪最高160万,鸿蒙开发者迎来黄金期!

华为正致力于让鸿蒙系统&#xff08;HarmonyOS&#xff09;成为中国的 Andorid。 鸿蒙操作系统诞生于 2019 年&#xff0c;彼时恰逢华为被禁止使用谷歌应用。一晃 4 年&#xff0c;鸿蒙操作系统已经更新到了 4.0 版本&#xff0c;截止今年 8 月&#xff0c;已有超过 7 亿台设备…