#include #include #include #include #include #include #include using namespace std; #define ll long long const int maxn=1e5+10; ll a[maxn],v1[maxn],v2[maxn],v3[maxn],pos[maxn],array_v[maxn],array_pos[maxn]; int main() { ll n,t,cnt,array_cnt,i,j; long long m,times; ///不用unsigned ll cur,sum_neg; scanf("%lld",&t); while (t--) { // scanf("%d",&n,&m); // cin>>n>>m; memset(a,0,sizeof(a)); memset(array_pos,0,sizeof(a)); memset(array_v,0,sizeof(a)); memset(pos,0,sizeof(a)); memset(v3,0,sizeof(a)); memset(v2,0,sizeof(a)); memset(v1,0,sizeof(a)); scanf("%lld%lld",&n,&m); cnt=0; cur=0; array_cnt=0; for (i=1;i<=n;i++) { scanf("%lld",&a[i]); cur+=a[i]; if (cur<0) { cnt++; v1[cnt]=cur-a[i]; v2[cnt]=cur; v3[cnt]=i; cur=0; /// } if (cur>array_v[array_cnt]) { array_cnt++; array_v[array_cnt]=cur; array_pos[array_cnt]=i; } } if (cur<=0) { ///t1 if (array_v[array_cnt]=m) // break; // printf("%lld\n",array_pos[i]); printf("1\n"); } } else { /** 如果冲破了第几个负值,那么…… 影响每轮增加的数值 **/ ///t2 ///如果array_cnt=1呢? // for (i=1;i<=array_cnt;i++) // if (array_v[i]>=m) ///printf // break; // if (i!=array_cnt+1) // { //// printf("%lld\n",array_pos[i]); // printf("1\n"); // continue; // } if (array_v[array_cnt]>=m) { printf("1\n"); continue; ///或者每次是否写成函数形式,然后return } ll previous_cur=cur; ///这个应该错了 // for (i=1;i<=array_cnt;i++) // if (array_v[i]+cur>=m) ///+cur // break; // if (i!=array_cnt+1) // { //// printf("%lld\n",array_pos[i]+n); // printf("2\n"); // continue; // } ///改为 // for (i=1;i) ///沿用第一次的最后cur for (i=1;i<=n;i++) { // scanf("%lld",&a[i]); cur+=a[i]; if (cur>=m) break; ///或者每次是否写成函数形式,然后return if (cur<0) { // cnt++; // v1[cnt]=cur-a[i]; // v2[cnt]=cur; // v3[cnt]=i; cur=0; /// } // if (cur>array_v[array_cnt]) // { // array_cnt++; // array_v[array_cnt]=cur; // array_pos[array_cnt]=i; // } } if (cur>=m) { printf("2\n"); continue; } ///一轮还是<0 ??? 如果加上最后一个数字呢? sum_neg=0; for (i=1;i<=cnt;i++) sum_neg-=v2[i]; if (cur<=sum_neg) { printf("-1\n"); } else { // sum_total=cur-sum_neg; cur=0; array_cnt=0; for (i=1;i<=n;i++) { cur+=a[i]; if (cur>array_v[array_cnt]) { array_cnt++; array_v[array_cnt]=cur; array_pos[array_cnt]=i; } } ///有可能/1 ///第一轮 m-=previous_cur; ///>0 times=(m-array_v[array_cnt])/cur + ((m-array_v[array_cnt])%cur!=0) +1+1; // for (i=1;i<=array_cnt;i++) // if (array_v[i]>=m-cur*times) // break; // printf("%lld\n",array_pos[i]+n*times); // printf("%lld\n",times); // cout<=m-cur*times) // break; // printf("%lld\n",array_pos[i]+n*times); } // for (i=1;i<=array_v[];i++) // int times=(m-array_v[array_cnt]+cur-1)/cur; // // for (i=1;i<=array_cnt;i++) // if (array_v[i]>=m-cur*times) // break; // printf("%lld\n",array_pos[i]+n*times); } } return 0; } /** 像昨天一样 分很多情况? 3 5 3 -10 6 3 5 4 -10 -10 5 15 5 -10 10 -20 6 第一次 运行比较慢 100 1 1000000000000000000 1 1 1000000000000000000 0 1 1000000000000000000 -1 1 1000000000000000000 3 2 10 -5 10 2 15 -5 10 2 15 -5 9 4 101 2 1 0 0 2 6 5 -5 5 100 10 9 8 7 -20 5 1 -1 1 -1 1 -1 5 1 -1 -1 -1 -1 -1 不要慌 应该没有时间做其它题 25mins **/