求小数据hack,WA 90pts!!!
  • 板块P1484 种树
  • 楼主czy0323
  • 当前回复6
  • 已保存回复6
  • 发布时间2023/7/14 19:31
  • 上次更新2023/11/3 09:49:57
查看原帖
求小数据hack,WA 90pts!!!
538427
czy0323楼主2023/7/14 19:31
#include<iostream>
using namespace std;
const int N = 5e5+5;
#define int long long
int n, k;
int a[N];
int f[N], Max[N], L[N];

inline bool check(int d){
	for(int i = 1; i <= n; i++)
		f[i] = Max[i] = L[i] = 0;
	if( a[1] + d >= 0 ){
		Max[1] = f[1] = a[1] + d;
		if( a[1] + d == 0 )
			L[1] = 0;
		else
			L[1] = 1;
	}
	for(int i = 2; i <= n; i++){
		if( a[i] + d >= 0 ){
			f[i] += Max[i - 2] + a[i] + d;
			if( f[i] > Max[i - 1] ){
				Max[i] = f[i];
				if( a[i] + d > 0 )
					L[i] = L[i - 2] + 1;
				else
					L[i] = L[i - 2];
			}
			else if( f[i] == Max[i - 1] ){
				Max[i] = Max[i - 1];
				if( a[i] + d > 0 )
					L[i] = min(L[i - 1], L[i - 2] + 1);
				else
					L[i] = min(L[i - 1], L[i - 2]);
			}
			else{
				Max[i] = Max[i - 1];
				L[i] = L[i - 1];
			}
		}
		else{
			Max[i] = Max[i - 1];
			L[i] = L[i - 1];
		}
	}
	if( L[n] <= k )
		return 1;
	return 0;
}
 
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    
    cin >> n >> k;
    for(int i = 1; i <= n; i++)
    	cin >> a[i];
    
    if( check(0) ){
    	cout << Max[n];
    	return 0;
    }
    int l = -1e7, r = 0, ans = 0;
    while( l != r ){
    	int mid = (l + r) >> 1;
    	if( check(mid) ){
    		l = mid + 1;
    		ans = max(ans, Max[n] - L[n] * mid);
    	}
    	else
    		r = mid;
    }
    cout << ans;
	return 0;
}
2023/7/14 19:31
加载中...