CF1398C Good Subarrays(写给我们萌新团体)
Good Subarrays
传送门:
Good Subarrays - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
思路
暴力!!!!!
一如既往的暴力!!!
复杂度O(n^2) 数据n到1e5
TLE必定TLE
我们可以用一个桶来优化
实质上其实还是高中所学的排列组合思想
第一步:当然是前缀和了,这边讲给新手写一下,有点冗杂,是高手直接跳到文章结尾点个赞就可以走了
rep(i,1,n){
sum[i]=sum[i-1]+a[i];
}
//有很多题解里可能出现rep等字样来代替for
//这边一般是用宏定义的方法,在本题中rep(i,1,n)表示范围为[1,n];
//就是sum[i-1]表示1~i-1的和,那么sum[i]=sum[i-1]+a[i]就表示前i-1的和加上第i个数就是1~i的和
ok!!!最基础的解决了
第二步:变形求解
sum[j]-sum[i]=j-i;
题目无非要求的就是这种情况的组成方案数
简单解析一下这是什么:
sum[j],sum[i]分别表示第前j个数的和和前i个数的和(这里令j>i,为了求i+1~j的和)
那么sum[j]-sum[i]就是i+1~j的和,j-i就是这个i+1~j这个区间有多少数
题目要求的不就是正好 区间i+1~j的和=区间里包含是数有几个
这边用i+1只是为了后面方便就计算
其实这变成i~j后面变成j-i+1也是一样的要有i=i+1这样的编程转换思想,要是不懂用x=i+1来套这里就不过多讲述
ok!?我们知道要求什么了
但是这样的条件是涉及到两个数的,涉及到两个数那只能是暴力判断符合条件然后一个一个加过去
我们这边就需要把他优化变成只涉及到当前数也就是一个数那边是不是可以优化到O(n)了
仔细一想变形成sum[j]-j=sum[i]-i是不是就至于i(说跟j相关也没关系跟上面所描述的变成思想是一回事)相关了
第三步:桶优化
这边用map来代替桶,为什么呢?
因为用数组可能越界
比例说我当前的数据为000000……
那是不是马上就可以知道前i个数之和减去i肯定小于0
用map虽然会稍微慢一点(因为map的查找是O(logn))但是这道题够用
基本够用的O(logn),因为O(logn)最多也才几十我感觉跟O(1)差不多的
开头我们说了这里和高中的排列组合有关系,就是在这
为了方便思考和方便写这边就不写sum[j]-j,sum[i]-i之类的我直接用第k个数表述(就是本小块中的第k个数就是表述sum[k]-k,第一个数就表示sum[1]-1,……以此类推,这句话有点扯淡,写到后面我发现好像这样跟繁琐了)
那么我们遇到一个从未遇到的情况那是不是没有别的情况与当前情况匹配,那么这时候当前方案数就是0
如果我们第二次遇到这种情况那么当前方案数就是1(因为符合了sum[j]-j=sum[i]-i也就是符合了sum[j]-sum[i]=j-i,这边i肯定不等于j的我就不加以赘述了)
那么以此类推我第三次遇到这种情况当前方案数就是2
……
但是有跟我一样的萌新可能就不懂了
第二次遇到肯定是好理解的,那么第三次遇到呢?
这边我们假设也不用假设后面遇到的k肯定是大于前面的
那么组成情况就有两种,第一次是跟第一次数遇到的组,第二次跟第二次遇到的数组
那是不是2种,
这边只需要考虑当前情况做j,然后把已有的情况做i(j是既定的,i是之前遇到的)
代码如下
rep(i,1,n) {//与上述rep一样
//a[i]=nums[i-1]-'0';
//sum[i]=sum[i-1]+a[i];
res+=m[sum[i]-i]++;这边其实求完m之后做一个0~n-1的等差数列也ok的意思一样的要是这边不太好理解
//后置++是先放参与加运算再自身+1
}
ok了思路就是这么多
AC code
// Problem:
// Good Subarrays
//
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/CF1398C
// Memory Limit: 250 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include<iostream>
#include<algorithm>
//#include<cstdio>
#include<map>
#define ll long long
#define int long long
#define endl '\n'
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>(b);i--)
#define N 100010 //1e6+100
using namespace std;
int a[N],n,t,sum[N];
//本题需要用long long为了图方便我就直接宏定义把int定义成long long了
string nums;
map<int,int>m;
void solve(){
m.clear();
int res=0;
m[0]=1;//这句话一定要打!
//这是为什么呢?因为如果当前前缀和(表示为1~i个数的和)等于这段区间长度i那么测试就是sum[i]-i=0那就不用去找别的数了肯定是好子数组
//这里其实也是一个比较难理解的点
//这样理解可能比较好动m[0]=1就表示m[sum[0]-0]=1也就是说有符合sum[0]-0==sum[i]-i这边(i仅表示第一次遇到,i=0的时候是他第0次遇到,所以当第一次遇到之前,他们已经相遇过一次,方法就按上面的方法继续处理下去)
//这是个重难点,需要思考一下
cin>>n>>nums;
rep(i,1,n) {
a[i]=nums[i-1]-'0';
sum[i]=sum[i-1]+a[i];
res+=m[sum[i]-i]++;
}
cout<<res<<endl;
}
signed main(){
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>t;
while(t--) solve();
return 0;
}
有问题请评论或私信我,谢谢!
有共同学习需求的可以加入洛谷团队:https://www.luogu.com.cn/team/66731
CF1398C Good Subarrays(写给我们萌新团体)的更多相关文章
- 手把手教你提交Jar包到Maven公共仓库 | 萌新写开源02
在上一篇文章中,我介绍了自己的SpringBoot Starter项目,可以让我们使用注解的方式轻松地获取操作日志,并推送到指定数据源. 之前,我的项目开源在Github上,大家想要用我的项目,还得把 ...
- 萌新笔记——C++里创建 Trie字典树(中文词典)(三)(联想)
萌新做词典第三篇,做得不好,还请指正,谢谢大佬! 今天把词典的联想做好了,也是比较low的,还改了之前的查询.遍历等代码. Orz 一样地先放上运行结果: test1 ID : char : 件 w ...
- 萌新笔记——C++里创建 Trie字典树(中文词典)(二)(插入、查找、导入、导出)
萌新做词典第二篇,做得不好,还请指正,谢谢大佬! 做好了插入与遍历功能之后,我发现最基本的查找功能没有实现,同时还希望能够把内存的数据存入文件保存下来,并可以从文件中导入词典.此外,数据的路径是存在配 ...
- 萌新笔记——C++里创建 Trie字典树(中文词典)(一)(插入、遍历)
萌新做词典第一篇,做得不好,还请指正,谢谢大佬! 写了一个词典,用到了Trie字典树. 写这个词典的目的,一个是为了压缩一些数据,另一个是为了尝试搜索提示,就像在谷歌搜索的时候,打出某个关键字,会提示 ...
- Ingress 记萌新的第一次连多重(xjbl)
之前为了升七,ArtanisWei学长告诉我可以去紫金园雕塑[这是什么地方啊],顺带靠卖萌骗了一桶key 于是屁颠屁颠的跑去按照群里攻略开始连多重[馒头 by handsomepeach],连了一百年 ...
- java萌新尝试搭建WordPress记录
问题1:安装好PHP环境没找好mysql路径,导致不能调用数据库模块 解决方案:重装一次,参考链接 https://www.cnblogs.com/yangxia-test/p/4174372.htm ...
- 萌新关于C#委托一点见解
开博第一写C#委托(一个简单的委托) 1.关于委托,一直是学习c#的萌新们的噩梦,小生也是.最近在学委托感觉瞬间被虐成狗,但作为C#中极为重要的一个内容,学好了将会及大地减少我们的代码量,而且这也是够 ...
- 萌新的IDEA_web开发笔记(未完)
萌新IDEA_web开发笔记 按兴趣自己搞的网页: http://47.94.140.98:8080/ow_web/my_web/web/ 暂时还没做完. 部署在租的服务器上面,背景视频加载可能有点慢 ...
- Unity萌新日记—开发小技巧与冷知识(脚本篇)
在学习unity的过程中,总会遇到很多零碎的知识点和小技巧,在此把它们记录下来,方便日后查看. 第一篇是关于脚本的一些你可能不知道的小知识. 还是个正在学习的萌新,如果写的不好,请谅解. Unity版 ...
- 萌新web前端从零开始(1)——计算机入门
前言:这是一个萌新从零开始的学习之路,与大家分享自己的看法与见解,还请指出错误与遗漏点方便改正. 1.认识计算机. 计算机语言常见的有C,PHP,Ruby,Java,C#,Basic,JS,C++等, ...
随机推荐
- [转帖]Oracle、SQL Server、MySQL数据类型对比
Oracle.SQL Server.MySQL数据类型对比 - 知乎 (zhihu.com) 1,标准SQL数据类型 BINARY 每个字符占一个字节 任何类型的数据都可存储在这种类型的字段中.不需数 ...
- [转帖]TiUP 常见运维操作
https://docs.pingcap.com/zh/tidb/stable/maintain-tidb-using-tiup 本文介绍了使用 TiUP 运维 TiDB 集群的常见操作,包括查看集群 ...
- [转帖]兆芯官方的CPU测试成绩,我复现不了
https://baijiahao.baidu.com/s?id=1734998483605483848 下图是兆芯网官上的公开测试成绩,测试对象是3.0GHz的KX-U6880A. 有几个问题: ...
- [转帖]华为毕昇 JDK 8u292、11.0.11 发布!
https://baijiahao.baidu.com/s?id=1705499834793298544&wfr=spider&for=pc 2021 年 6 月 30 日,毕昇 JD ...
- ESXi上面虚拟机磁盘损坏修复案例
事故情况 最近同事反馈, 一个文件更新后出现了文件部分不可读的情况 具体现象为: 前端功能打开白屏 后端文件 前面93行不显示, notepad++打开都是 NULL 黑框. 然后重新覆盖文件, 有概 ...
- 最小的 $x$ 满足 $L\le x\bmod P\le R$
设 \(G(L, R, D, P)\) 为 \(y P+L \leq x D \leq y P+R\) ,满足 \(1 \leq L \leq R<P, D<P\) ,其中 \(x\) 的 ...
- vite按需加载element-plus,减少项目体积,你必须学会
1.在项目中安装 $ npm install element-plus --save $ yarn add element-plus $ pnpm install element-plus 2.安装对 ...
- 西门子PLC高校作业以及创新项目
抢答器 在主持人按下启动按钮,3秒内
- NSSCTF Round#17 Basic CRYPTO
Level_1 题目 Level_1.py(我把参数整理了一下,看着舒服) #真签到题 from Crypto.Util.number import bytes_to_long, getPrime f ...
- TienChin 活动管理-搜索活动
ActivityController @PreAuthorize("hasPermission('tienchin:activity:list')") @GetMapping(&q ...