NC200281. The Flower of Hope
描述
输入描述
第一行为两个正整数n和m,含义如题目描述,之间使用一个空格符分隔。
第二行为n个非负整数,其中第i个输入的整数记作,相邻整数之间使用一个空格符分隔。
数据规范:
*.
*.
*.
输出描述
输出一个正整数,表示满足条件的子区间数目。
示例1
输入:
5 2 1 1 1 1 1
输出:
10
说明:
任意长度大于1的子区间都满足条件。示例2
输入:
5 2 2 2 2 2 2
输出:
15
说明:
所有子区间都满足条件。示例3
输入:
3 10 1 2 3
输出:
0
说明:
所有的子区间都不满足条件。C++14(g++5.4) 解法, 执行用时: 23ms, 内存消耗: 1528K, 提交时间: 2020-06-14 13:26:37
/*================================================================ * * 创 建 者: badcw * 创建日期: 2020/6/14 * ================================================================*/ #include <bits/stdc++.h> #define ll long long using namespace std; const int maxn = 1e5+50; const int mod = 1e9+7; ll qp(ll a, ll n, ll mod = ::mod) { ll res = 1; while (n > 0) { if (n & 1) res = res * a % mod; a = a * a % mod; n >>= 1; } return res; } int n, m; int a[maxn]; ll pre[maxn]; int main(int argc, char* argv[]) { scanf("%d%d", &n, &m); for (int i = 1; i <= n; ++i) { scanf("%d", &a[i]); pre[i] = pre[i - 1] + a[i]; } ll res = 0; for (int i = 1; i <= n; ++i) { res += upper_bound(pre, pre + i, pre[i] - m) - pre; } printf("%lld\n", res); return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 30ms, 内存消耗: 1616K, 提交时间: 2020-06-18 19:13:44
#include<bits/stdc++.h> using namespace std; int a[100005]; int main() { int x,l,r,n,m; long long ans=0; scanf("%d%d",&n,&m); for(x=1;x<=n;x++)scanf("%d",&a[x]); for(x=0,l=r=1;r<=n;r++) { x+=a[r]; while(x>=m)ans+=n-r+1,x-=a[l++]; } printf("%lld\n",ans); }