T2 小信的无限数组RE10pt求助

2.  小信的无限数组
题目ID:20679必做题100分
最新提交:
Runtime Error
10 分
历史最高:
Runtime Error
10 分
时间限制: 2000ms
空间限制: 262144kB
题目描述
小信有一个长度为n的数组 ,他现在把这个数组不断地往后拼接,形成一个以n个元素为周期的长度无限的数组

小信想要知道是否存在一个连续的子数组使得这个子数组的和为S。

输入格式
第一行输入一个整数t(1≤t≤10),表示测试数据的组数。

对于每组测试数据,第一行输入两个整数n和S分别表示数组的长度和要求子数组和的大小。

第二行输入n个整数

输出格式
对于每组测试数据,如果合法输出一行Yes,否则输出一行No。

样例
Input 1
3
3 42
3 8 4
3 1
3 8 4
20 83298426
748 169 586 329 972 529 432 519 408 587 138 249 656 114 632 299 984 755 404 772
Output 1
Yes
No
Yes
样例解释
对于第一组测试数据,无限的数组为(3,8,4,3,8,4,...),小信可以选择(a2,a3,a4,a5,a6,a7,a8,a9)=(8,4,3,8,4,3,8,4),总和为42,所以结果是Yes。

my code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
  int T;
  cin>>T;
  while(T--){
    ll k,n,sum[200005]={0},now=0;
    cin>>n>>k;
    for(ll i=1;i<=n;i++){
      ll x;
      cin>>x;
      sum[i]=sum[i-1]+x;
    }
    ll c=k%sum[n],f=0;
    for(ll i=n+1;i<=2*n;i++){
      sum[i]=sum[i-n]+sum[n];
    }
    for(ll i=1;i<=2*n;i++){
      if(sum[i]-sum[now]==c){
        f=1;
        cout<<"Yes"<<endl;
        break;
      }
      if(sum[i]-sum[now]>c){
        now++;
        i--;
      }
    }
    if(f==0){
      cout<<"No"<<endl;
    }
  }
  return 0;
}

蒟蒻求助!

sum开小了

n<=2e5

没用
而且我200000就是2*10^5(2e5)

要开两倍

AC了
谢谢 :grin:
9867326429392f4eba431db9f12e2368

@胡泽宸 巨佬我问一下,我为什么这样RE0?

#include<bits/stdc++.h>
#define I using
#define AK namespace
#define IOI std
#define i_ak return
#define ioi  0
I AK IOI;
int t;
int main(){
	//freopen("","r",stdin);
	//freopen("","w",stdout);
	cin>>t;
	while(t--){
		int n,s,a[500005],sum[500005]={0},now=0;
		cin>>n>>s;
		for(int i=1;i<=n;i++){
			cin>>a[i]; 
			sum[i]=sum[i-1]+a[i];
		}
		int R=s%sum[n];
		for(int i=n+1;i<=2*n;i++)sum[i]=sum[i-n]+sum[n];
		bool flag=0;
		for(int i=1;i<=2*n;i++){
			if(sum[i]-sum[now]==R){
				flag=1;
				puts("Yes");
				break;
			}
			if(sum[i]-sum[now]>R){
				now++;
				i--;
			}
		}
		if(!flag)puts("No");
	}
	i_ak ioi;
}

@王钰宸涵

你A了吗

没开long long

@尤子睿 AC了

1 个赞