https://codeforces.ml/contest/1333/problem/C

大概题意是规定和为0的数组为不合格数组,询问给定数组中共有多少个合格子数组。

解题

子数组的数量

一个长度为 \(n\) 的数组 \(a[0,n-1]\),选取 \(i\) 作为子数组的终点,那么我们可以选取 \([0,i]\) 中的任何一个 \(j\) 作为起点,这样可以得到子数组 \(a[j,i]\) ,所以以 \(i\) 为终点的子数组有 \(i+1\) 种。以此类推,最终子数组的总个数为 \(count=\sum_{i=0}^{n-1}(i+1)= (n+1)*n/2\) 。

合格子数组的数量

根据题意可得,如果一个数组是不合格的(存在子数组和为0),则含有这个数组的所有父亲数组都是不合格的。

当我们以 \(i\) 为子数组终点时。

如果子数组 \(a[p_1,p_2](p_2\le i)\) 是不合格数组,那么我们只能在 \((p_1,i]\) 区间内选取起点 \(j\) (共 \(i-p_1\) 种),否者新数组会成为不合格部分的父亲数组。

如果 \(p_2 \gt i\) 的话,则可以在 \([0,i]\) 区间内选取起点 \(j\),共计 \(i+1\) 种。

我们设 \(s\) 为所有出现在位置 \(i\) 之前的不合格子数组的起点位置的集合。设 \(f(i)\) 为以 \(a_i\) 为结尾的合格子数组个数,\(f(i) = i-max\{p|p<i,p\in s\}\),如果 \(p\) 不存在,那么 \(f(i) = i+1\)。

全部合格子数组的数量 \(ans = \sum_{all}f(i)\),不会重复计算。

代码

#include<bits/stdc++.h>
#define ll long long #define fr(i,n) for(int i=0;i<n;i++)
#define frs(i,n,flag) for(int i=0;i<n&&flag;i++) #define frr(i,j,n) for(int i=j;i<n;i++)
#define r_frr(i,j,n) for(int i=n-1;i>=j;i--) #define frrs(i,j,n,flag) for(int i=j;i<n&&flag;i++)
#define r_frrs(i,j,n,flag) for(int i=n-1;i>=j&&flag;i--) #define arend(i,n) ((i!=n-1)?" ":"\n")
#define memset0(dp) memset(dp,0,sizeof(dp))
#define print_arr(begin,end) for(auto it = begin;it!=end;it++) cout<<*it<<arend(it,end);
#define log_this(name,value) cout<<name<<": "<<value<<endl;
#define e4 10004#define e5 100005#define e6 1000006#define e7 10000007#define e9 1000000000#define INF 9999999
using namespace std;
int to_int(string s) {stringstream ss;ss<<s;int a;ss>>a;return a;}
string to_str(double a) {stringstream ss;ss<<a;return ss.str();} int main(){ cin.tie(0);
//ios::sync_with_stdio(false);
//cout<<setiosflags(ios::fixed)<<setprecision(0); //freopen("1.out","w",stdout); int n;
while(cin>>n){
ll sum=0,p=-1,ans=0,inp;
map<ll,ll>loc;loc[0] = 0;
fr(i,n){
cin>>inp;
sum += inp;
auto it = loc.find(sum);
if(it!=loc.end()){
p = max(p,loc[sum]);
}
loc[sum] = i+1;
ans += i - p;
}
cout<<ans<<endl;
}
return 0;
}

CF632(div.2)C. Eugene and an array的更多相关文章

  1. Codeforces Round #533 (Div. 2) C. Ayoub and Lost Array 【dp】

    传送门:http://codeforces.com/contest/1105/problem/C C. Ayoub and Lost Array time limit per test 1 secon ...

  2. Codeforces Round #136 (Div. 1) B. Little Elephant and Array

    B. Little Elephant and Array time limit per test 4 seconds memory limit per test 256 megabytes input ...

  3. Codeforces Round #533(Div. 2) C.Ayoub and Lost Array

    链接:https://codeforces.com/contest/1105/problem/C 题意: 给n,l,r. 一个n长的数组每个位置可以填区间l-r的值. 有多少种填法,使得数组每个位置相 ...

  4. Eugene and an array CodeForces - 1333C (思维)

    题目大意:求好数组的个数,所谓好数组 1好数组是原数组的一段连续的子数组,2 好数组不包含元素和为0的子数组. 题解:唉,这个题目把我给些懵了....我一开始的想法求后缀和,保存位置,然后枚举前缀和, ...

  5. Eugene and an array(边界麻烦的模拟)

    一道看似小学生的题,搞了我几个小时...... 首先思路就有两种: \(Ⅰ.找和为0的bad子串,再用n*(n+1)/2-bad子串得到答案\) \(Ⅱ.找和不为0的good子串\) 如果你选择找ba ...

  6. Codeforces Round #533 (Div. 2) C. Ayoub and Lost Array(递推)

    题意: 长为 n,由 l ~ r 中的数组成,其和模 3 为 0 的数组数目. 思路: dp[ i ][ j ] 为长为 i,模 3 为 j 的数组数目. #include <bits/stdc ...

  7. Codeforces Round #632 (Div. 2)

    Codeforces Round #632 (Div. 2) 这一场打的好差呀,这几次艰难上的分全部掉回去了,感觉就像一夜回到了解放前. 说实话,就是被B卡到了,没看到只能从小的放到大的... Lit ...

  8. Codeforces Round #258 (Div. 2) 小结

    A. Game With Sticks (451A) 水题一道,事实上无论你选取哪一个交叉点,结果都是行数列数都减一,那如今就是谁先减到行.列有一个为0,那么谁就赢了.因为Akshat先选,因此假设行 ...

  9. 使用jQuery.makeArray() 将多种类型转换成JS原生Array

    jQuery.makeArray(obj)这个函数从名字上来看非常easy猜出它的用途:应该是用来将传入的对象转换成一个原生array 再看看官网上对它的解释:Convert an array-lik ...

随机推荐

  1. selenium+options配置文件

    from selenium.webdriver.chrome.options import Options from selenium import webdriver chrome_options ...

  2. Hadoop集群搭建(一)~虚拟机的创建

    Hadoop集群的搭建包括,虚拟机系统的安装:安装JDK,Hadoop:克隆虚拟机:伪分布式的搭建:安装zookeeper:Hive:Hbae:Spark等等: 我将分为多篇文章来记录.这篇文章主要写 ...

  3. P5596 【XR-4】题 笔记

    P5596 [XR-4]题 其实这题我昨天没做出来--所以今天写一下笔记 昨天我还信誓旦旦地说这一定是一道黑题\(OTZ\).果然菜是原罪. 另外吐槽一下科技楼机房频繁停电,昨天写了两小时的树刨和倍增 ...

  4. C#基础--迭代器初识

    foreach语句是枚举器(enumerator)的消费者,而迭代器(iterator)是枚举器的产生者. 迭代器模式能提供一种顺序访问一个集合内部的元素,而又不会暴露其内部的方法.当然其缺点就是用f ...

  5. 9. selenium+request方式的cookie绕过

    1. 首先确认POST请求的content-type类型 2. 查看cookies数据 3. 找到对应的headers数据 4. 如果是application/json,传入的json数据需要时jso ...

  6. iOS/macOS推荐个高效苹果开发工具, JSON 转模型代码工具,不再为复杂JSON数据写模型而烦恼,支持Swift/Objective-C,极速转换

    CCJSON 是一款运行在macOS上 JSON 转模型代码工具,不再为复杂JSON数据写模型而烦恼,可识别嵌套模型,字典/数组,支持Swift/Objective-C,操作方便,极速转换.下载 效果 ...

  7. Andorid 添加MenuPopup

  8. Postman从入门到入门

    1.Postman简介 Postman是一个接口测试工具,在做接口测试的时候, Postman相当于一个客户端,可以发送请求到服务器端.Postman分为Chrome插件版本(不再更新维护)和Nati ...

  9. hdu1213 并查集板子

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1213/ 并查集是一种支持合并与查找的数据结构,在森林中进行操作,加上路径压缩,合并和查找的时间复杂度几乎都是常数 ...

  10. linux常用命令(运维用到)

    0.基础命令 pwd 查看当前目录 ls 查看当前目录所有文件夹和文件 mkdir 新建目录 mkdir -p a/b/c 创建多级目录 touch 新建文件 cat 查看文件 clear 清屏 sh ...