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. [转帖]5 分钟学会写一个自己的 Prometheus Exporter

    https://cloud.tencent.com/developer/article/1520621学习一下怎么搭建呢.   去年底我写了一个阿里云云监控的 Prometheus Exporter, ...

  2. [转帖]shell脚本使用expect自动化交互登录远程主机进行批量关机

    前文 1.目标主机登录用户都为root,且密码一致 2.目标主机开放启动了SSH服务且22号端口可访问(防火墙未进行拦截) 软件介绍 expect Expect是一个用来实现自动和交互式任务进行通信的 ...

  3. [转帖]探索惊群 ③ - nginx 惊群现象

    https://wenfh2020.com/2021/09/29/nginx-thundering-herd/    nginx  kernel 本文将通过测试,重现 nginx(1.20.1) 的惊 ...

  4. [转帖]JVM 问题诊断快速入门

    https://zhuanlan.zhihu.com/p/110197145 JVM 全称为 Java Virtual Machine,翻译为中文 "Java 虚拟机".本文中的J ...

  5. 软件缺陷(bug)

    生活中我们肯定听过身边的朋友说过:'这tm就是个bug','你就是bug一样的存在' 等话语.当你听到这句话的时候或许有些懵逼或许认为这货说的什么玩意.其实当你想成为一名测试工程师的时候你就要天天和b ...

  6. git查看自己是从那个分支建的分支

    可能发生的情况 很多时候,开始建分支的时候, 能够确认自己是那个分支建的,但是当写完功能之后, 再去回想,有时是忘记自己基于那个分支建的分支. 这时有一个命令的话就可以很快的定位了. 查看创建的分支来 ...

  7. CMake出错的处理

    在windows上使用cmake来c++的程序,遇到一个问题 问题排查 试过在电脑上单独使用gcc是可以编译成功的,那么就可能是IDE集成的问题了 IDE的编译工具链从mingw换成vs,编译通过 让 ...

  8. 系统Hosts文件原理和应用

    Hosts的概念 Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应的IP地址建立一个关联"数据库",当用户在浏览器中输入一个需要 ...

  9. 部署MooseFS分布式文件系统

    MooseFS是一个分布式文件系统,其本身具有高可用性,高拓展性,开放源代码,高容错,等在数据的读写性能方面,通过dd测试,MooseFS也就是写入的速度稍微好于NFS,读上没有差别. MooseFS ...

  10. “I/O多路复用”和“异步I/O”的前世今生

    曾经的VIP服务在网络的初期,网民很少,服务器完全无压力,那时的技术也没有现在先进,通常用一个线程来全程跟踪处理一个请求.因为这样最简单.其实代码实现大家都知道,就是服务器上有个ServerSocke ...