CF Div 2 D 求助
  • 板块学术版
  • 楼主苏联小渣
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/9/23 22:53
  • 上次更新2023/10/27 10:13:01
查看原帖
CF Div 2 D 求助
399286
苏联小渣楼主2022/9/23 22:53

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;
}

2022/9/23 22:53
加载中...