当前位置: 首页 > news >正文

codeforces C. Cool Partition

目录

题目简述:

思路:

总代码:



https://codeforces.com/contest/2117/problem/C

 

题目简述:

给定一个整数数组,现要求你对数组进行分割,但需满足条件:前一个子数组中的值必须在后一个子数组中全部出现(例如 123142,可以分成12 和3142这俩子数组)求子数组个数

思路:

关键思路很好想:尽可能早的进行数组分割

具体实操很难搞

我们可以维护一个集合,遍历整个数组,不断弹出当前所遍历到的值,如果这个集合为空了,那么此时就满足的分割条件,且是最优分割位置,此时ans++,此时集合需要更新成前一个集合(假设有集合a1,a2,a3,此时满足了a1中全部元素在a2中全出现了,下次再判断时就要满足a2中全部元素在a3中全部出现,所以把集合更新成a2)

接下来我们想用什么容器存呢?

这个容器得可以实现:任意删除,判空,去重(若a1中出现俩相同元素如a1=112,a2中只需出现一次1即可,所以要去重)。

那很显然了就是set。

总结:

使用集合s记录当前段的所有元素

从左到右遍历数组,对于每个元素a[i],将其从集合中删除

当集合为空时,说明当前段的所有元素都能在后续段中找到(因为已被删除),可以在此处分割

分割后重置集合,记录新段的起始位置

最后处理可能未完成的段

总代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl "\n"
const int N=5e5+10;
int a[N];
void solve(){int n;cin>>n;set<int>s;for(int i=1;i<=n;i++)cin>>a[i];int ans=1;int r=1;for(int i=1;i<=n;i++) {s.erase(a[i]);if(s.empty()){ans++;for(int j=r;j<=i;j++)s.insert(a[j]);r=i+1;}}if(!s.empty())ans--;cout<<ans<<endl;
}
signed main(){ios::sync_with_stdio(false);cin.tie(nullptr);int q=1;cin>>q;while(q--) solve();return 0;
}

相关文章:

  • Python爬虫(四):PyQuery 框架
  • Kafka入门-监控与可视化
  • sshd代码修改banner
  • 在 Figma 中导出图标为 Iconfont
  • 认识CMake并使用CMake构建自己的第一个项目
  • vmware ubuntu扩展硬盘(可用)
  • 数据库和SQL面试题
  • 安装和使用G4F(GPT4Free) 最新0.5.3.2 版本
  • 使用 Python 正则表达式实现文本替换与电话号码规范化
  • 【实证分析】上市公司企业风险承担水平数据集(2000-2022年)
  • 针对药品仓库的效期管理问题,如何利用WMS系统“破局”
  • 斐波那契数列
  • Prompt‏ 工程和优化技巧
  • 网络安全A模块专项练习任务六解析
  • Python文本序列的类型
  • P9-QA 数据集生成工具
  • Python任务调度模型
  • 在Mathematica环境中做数值实验来观察逻辑映射的复杂度
  • STL 1 容器
  • NoMachine 远程连接时遇到“黑屏
  • 网站建设管理成本估计/百度优化是什么
  • 武汉专业网站做网页/百度关键词优化的意思
  • 嘉兴网站关键词排名/盘古百晋广告营销是干嘛
  • 开发公司取名/seo网站优化推广教程
  • 网站模板框架/b站视频推广网站400
  • 个人网站的设计与实现毕业论文5000字/优云优客百度推广效果怎么样