pretest 过了,但它 FST 了,麻烦挑一下错或者给个 hack 数据,谢谢。
#include <bits/stdc++.h>
using namespace std;
#define int long long
int t, n, k, l, r, now, flag, a[200010], s[200010];
signed main(){
scanf ("%lld", &t);
while (t --){
flag = 0;
scanf ("%lld%lld", &n, &k);
for (int i=1; i<=n; i++){
scanf ("%lld", &a[i]);
}
l = k - 1, r = k + 1, now = a[k];
while (1){
int maxx = now, max2 = 0, maxp = 0, maxxx = 0;
for (; l>=1; l--){
now += a[l];
if (now < 0){
now -= a[l];
break;
}
maxx = max(maxx, now);
}
max2 = maxxx = maxx;
if (l == 0){
flag = 1;
break;
}
for (; r<=n; r++){
maxx += a[r];
if (maxx < 0){
maxx -= a[r];
break;
}
if (maxx - maxxx + now + a[l] >= 0){
r ++;
break;
}
}
if (r > n){
flag = 1;
break;
}
if (maxx - maxxx + now + a[l] >= 0){
now = now + maxx - maxxx;
}
else{
break;
}
}
l = k - 1, r = k + 1, now = a[k];
while (1){
int maxx = now, max2 = 0, maxp = 0, maxxx = 0;
for (; r<=n; r++){
now += a[r];
if (now < 0){
now -= a[r];
break;
}
maxx = max(maxx, now);
}
max2 = maxxx = maxx;
if (r == n + 1){
flag = 1;
break;
}
for (; l>=1; l--){
maxx += a[l];
if (maxx < 0){
maxx -= a[l];
break;
}
if (now + maxx - maxxx + a[r] >= 0){
l --;
break;
}
}
if (l < 1){
flag = 1;
break;
}
if (now + maxx - maxxx + a[r] >= 0){
now = now + maxx - maxxx;
}
else{
break;
}
}
printf (flag ? "YES\n" : "NO\n");
}
return 0;
}