目录
https://codeforces.com/contest/2086/problem/B
B. 大型数组与区间
每个测试的时间限制:2 秒
每个测试的内存限制:512 兆字节
有一个由 n 个正整数组成的数组 a ,以及一个正整数 k 。数组 b 是根据以下规则由数组 a 生成的:
b 包含 n⋅k 个数字;
数组 b 的前 n 个数字与数组 a 的数字相同,即当 i≤n 时,bi=ai;
对于任意 i>n ,有 bi=bi−n 。
例如,如果 a=[2,3,1,4] 且 k=3 ,那么 b=[2,3,1,4,2,3,1,4,2,3,1,4] 。
给定一个数字 x ,需要统计满足以下条件的位置 l(1≤l≤n⋅k)的数量:存在一个位置 r≥l ,使得数组 b 在区间 [l,r] 上的元素之和至少为 x(换句话说,bl+bl+1+⋯+br≥x )。
输入
每个测试由多个测试用例组成。第一行包含一个整数 t(1≤t≤104)—— 测试用例的数量。接下来是测试用例的描述。
每个测试用例的第一行包含三个整数 n,k,x(1≤n,k≤105;1≤x≤1018 )。
每个测试用例的第二行包含 n 个整数 ai(1≤ai≤108 )。
对输入的额外限制:
所有测试用例的 n 之和不超过 2⋅105;
所有测试用例的 k 之和不超过 2⋅105 。
输出
对于每个测试用例,输出一个整数 —— 数组 b 中满足条件的位置 l 的数量。
说明
在第一个测试用例中,数组 b 如下:
[3,4,2,1,5,3,4,2,1,5,3,4,2,1,5]
有 12 个位置 l 存在合适的位置 r 。以下是其中一些(并非全部):
l=1 ,此时存在位置 r=6 ,区间 [1,6] 上的和等于 18;
l=2 ,此时存在位置 r=5 ,区间 [2,5] 上的和等于 12;
l=6 ,此时存在位置 r=9 ,区间 [6,9] 上的和等于 10。
题目简述:
给定一个长度为n的数组,以及两个整数k和p,该数组可以通过复制来增加长度,可以复制k次,我们最后要找到保证后缀和至少为p的首元结点的数量
思路简述:
找到有多少个完整的原数组n,最后单独找最后一个不完整的数组n即可;
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+10;
int a[N];
void solve()
{
int n,k,p,cnt=0;
cin >> n >> k >> p;
for(int i=1;i<=n;i++)
cin >> a[i];
for(int i=1;i<=n;i++)
a[i]=a[i-1]+a[i];//预处理前缀和
int b=a[n]*k-p;//a[n]*k是全部的,p是最低限度,二者相减是符合条件的区间和的最大值
if(b<0)
{
cout << 0 << endl;
return ;
}
int c=b/a[n];
int d=b-a[n]*c;
int i;
for(i=1;i<=n;i++)
{
if(a[i]>d)break;
}
// cout << a[i]<< ' ' << d << ' ' << a[i-1] << endl;
// cout << i << endl;
cout << c*n+i<<endl;
}
signed main()
{
int q;
cin >> q;
while(q--)
solve();
}