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

C. Good Subarrays(前缀和)

C. Good Subarrays

  • 一、问题
  • 二、分析
  • 三、代码

一、问题

在这里插入图片描述

二、分析

这道题目的意思就是给我们一个数组,然后我们从数组中选取一个连续的区间,这个区间满足条件:区间内的元素和等于区间的长度。

对于区间和问题我们先想到的是前缀和的算法。

那么题目中的要求可以表示为:s[r]−s[l−1]=r−(l−1)s[r]-s[l-1]=r-(l-1)s[r]s[l1]=r(l1)

移向可得:
s[r]−r=s[l−1]−(l−1)s[r]-r=s[l-1]-(l-1) s[r]r=s[l1](l1)

我们可以构造一个新的数组,d[i]=s[i]−id[i] = s[i] -id[i]=s[i]i

这道题就可以转化为:在iii的左侧有多少等于d[i]d[i]d[i]的元素,这个个数就是我们以iii为右端点的符合条件的区间数目。

三、代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
int a[N], s[N], d[N];
ll ans;
void solve()
{ans = 0;int n;cin >> n;string str;cin >> str;for(int i = 1; i <= n; i ++ ){a[i] = str[i - 1] - '0';s[i] = a[i] + s[i - 1];d[i] = s[i] - i;}unordered_map<ll, ll> cnt;for(int i = 0; i <= n; i ++ ){ans += cnt[d[i]];cnt[d[i]] ++;}cout << ans << endl;
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t;cin >> t;while(t --)solve();
}
http://www.lryc.cn/news/28303.html

相关文章:

  • 关于Facebook Messenger CRM,这里有你想要知道的一切
  • ChIP-seq 分析:数据与Peak 基因注释(10)
  • 《C++ Primer Plus》第18章:探讨 C++ 新标准(8)
  • YOLO-V5 系列算法和代码解析(八)—— 模型移植
  • js实现复制拷贝的兼容方法
  • 学习 Python 之 Pygame 开发魂斗罗(八)
  • Lesson11---分类问题
  • Python基础学习12——异常
  • [日常练习]练习17:链表头插法、尾插法练习
  • 第十四届蓝桥杯模拟赛(第三期)试题与题解 C++
  • 关于 “宏“
  • 1.2 CSS标签选择器,类选择器
  • 【Linux】进程等待 | 详解 wait/waitpid 的 status 参数
  • OpenAI眼中的无线调优策略
  • DataX入门
  • 第二章SpringBoot基础学习
  • B - Build Roads (最小生成树 + 打表)
  • k8s管理工具
  • Cannot start compiler The output path is not specified for module mystatic(已解决)
  • python入门应该怎么学习
  • 不懂命令, 如何将代码托管到Gitee上
  • Mysql常见面试题总结
  • python第一周作业
  • FLoyd算法的入门与应用
  • 303. 区域和检索 - 数组不可变
  • Spring Cloud融合Nacos配置加载优先级 | Spring Cloud 8
  • LeetCode 236.二叉树的最近公共祖先
  • awk简单实例(持续更新中)
  • react动态路由组件的封装
  • Vue项目中引入高德地图步骤详解