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(写给我们萌新团体)的更多相关文章

  1. 手把手教你提交Jar包到Maven公共仓库 | 萌新写开源02

    在上一篇文章中,我介绍了自己的SpringBoot Starter项目,可以让我们使用注解的方式轻松地获取操作日志,并推送到指定数据源. 之前,我的项目开源在Github上,大家想要用我的项目,还得把 ...

  2. 萌新笔记——C++里创建 Trie字典树(中文词典)(三)(联想)

    萌新做词典第三篇,做得不好,还请指正,谢谢大佬! 今天把词典的联想做好了,也是比较low的,还改了之前的查询.遍历等代码.  Orz 一样地先放上运行结果: test1 ID : char : 件 w ...

  3. 萌新笔记——C++里创建 Trie字典树(中文词典)(二)(插入、查找、导入、导出)

    萌新做词典第二篇,做得不好,还请指正,谢谢大佬! 做好了插入与遍历功能之后,我发现最基本的查找功能没有实现,同时还希望能够把内存的数据存入文件保存下来,并可以从文件中导入词典.此外,数据的路径是存在配 ...

  4. 萌新笔记——C++里创建 Trie字典树(中文词典)(一)(插入、遍历)

    萌新做词典第一篇,做得不好,还请指正,谢谢大佬! 写了一个词典,用到了Trie字典树. 写这个词典的目的,一个是为了压缩一些数据,另一个是为了尝试搜索提示,就像在谷歌搜索的时候,打出某个关键字,会提示 ...

  5. Ingress 记萌新的第一次连多重(xjbl)

    之前为了升七,ArtanisWei学长告诉我可以去紫金园雕塑[这是什么地方啊],顺带靠卖萌骗了一桶key 于是屁颠屁颠的跑去按照群里攻略开始连多重[馒头 by handsomepeach],连了一百年 ...

  6. java萌新尝试搭建WordPress记录

    问题1:安装好PHP环境没找好mysql路径,导致不能调用数据库模块 解决方案:重装一次,参考链接 https://www.cnblogs.com/yangxia-test/p/4174372.htm ...

  7. 萌新关于C#委托一点见解

    开博第一写C#委托(一个简单的委托) 1.关于委托,一直是学习c#的萌新们的噩梦,小生也是.最近在学委托感觉瞬间被虐成狗,但作为C#中极为重要的一个内容,学好了将会及大地减少我们的代码量,而且这也是够 ...

  8. 萌新的IDEA_web开发笔记(未完)

    萌新IDEA_web开发笔记 按兴趣自己搞的网页: http://47.94.140.98:8080/ow_web/my_web/web/ 暂时还没做完. 部署在租的服务器上面,背景视频加载可能有点慢 ...

  9. Unity萌新日记—开发小技巧与冷知识(脚本篇)

    在学习unity的过程中,总会遇到很多零碎的知识点和小技巧,在此把它们记录下来,方便日后查看. 第一篇是关于脚本的一些你可能不知道的小知识. 还是个正在学习的萌新,如果写的不好,请谅解. Unity版 ...

  10. 萌新web前端从零开始(1)——计算机入门

    前言:这是一个萌新从零开始的学习之路,与大家分享自己的看法与见解,还请指出错误与遗漏点方便改正. 1.认识计算机. 计算机语言常见的有C,PHP,Ruby,Java,C#,Basic,JS,C++等, ...

随机推荐

  1. [转帖]Nginx - 根据IP分配不同的访问后端

    https://www.cnblogs.com/hukey/p/11868017.html 1. 需求分析 为了在线上环境提供测试分支,规定将某IP转发到测试程序地址.如果是 ngx 直接对外,采用 ...

  2. [转帖]容器化 TCP Socket 缓存、接收窗口参数

    https://blog.mygraphql.com/zh/notes/low-tec/network/tcp-mem/#rmem_default 最近需要支持一个单 POD 的 TCP 连接数上 1 ...

  3. [转帖]Linux中查找大文件两种姿势

    https://rumenz.com/rumenbiji/linux-find-du-max-file.html 使用find命令查找大文件 find命令是Linux系统管理员工具库中最强大的工具之一 ...

  4. [转帖]MinIO Client(mc)完全指南

    https://www.cnblogs.com/lvzhenjiang/p/14944821.html 目录 一.获取MinIO Client(mc) 1.1 docker版 1.2 Homebrew ...

  5. [转帖]vs调试运行程序出现:“由于找不到MSVCP140D.dll,无法继续执行代码 ”的解决方法

    碎碎念 最近在使用Visual studio调试程序的时候,突然冒出了"由于找不到MSVCP140D.dll,无法继续执行代码.重新安装程序可能会解决次问题."的错误.如下图所示. ...

  6. [转帖]linux 系统级性能分析工具 perf 的介绍与使用

    目录 1. 背景知识 1.1 tracepoints 1.2 硬件特性之cache 2. 主要关注点 3. perf的使用 3.0 perf引入的overhead 3.1 perf list 3.2 ...

  7. echarts控制柱状图柱条的宽度

    barWidth属性 series: [{ name: '销量', type: 'bar', barWidth : 30,//柱图宽度 data: [5, 20, 36, 10, 10, 20] }]

  8. VS2013未能正确加载microsoft.visualstudio.editor.implementation.editorpackage

    在用VS2013做项目,但是特别不顺利,这不,VS2013突然罢工了,连解决方案都打不开了,会出现如下的错误: 试了网上的各种解决方案,总算找到一个适合自己的,具体方法如下: 1.打开VS2013的& ...

  9. Git的使用(二):远程仓库

    在github上创建远程仓库 本地创建Git仓库适合自己一个人完成工程,但是实际情况中我们需要其他人来协作开发,此时就可以把本地仓库同步到远程仓库,同时还增加了本地仓库的一个备份.常用的远程仓库就是g ...

  10. python实现GUI自动化(控制鼠标)|屏幕快照&图像识别基础

    1.GUI自动化 ●GUI自动化就是写程序直接控制键盘和鼠标.这些程序可以控制其他应用,向它们发送虚拟的击键和鼠标点击,就像你自己坐在计算机前与应用交互-样.这种技术被称为"图形用户界面自动 ...