求调
查看原帖
求调
545310
YXD123456789楼主2024/11/19 16:28

样例也没过,悲

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5 + 2;
int id,T,n,k,t,p;
int a[N][2],sum[N][2];
int dp[N][2][2];
void work()
{
	int ans = -1e18;
	cin >> n >> k >> t >> p;
	memset(dp , -0x3f , sizeof dp);
	for(int i = 1;i <= n;i ++)
	{
		cin >> a[i][0] >> a[i][1];
		sum[i][0] = sum[i - 1][0] + a[i][0];
		sum[i][1] = sum[i - 1][1] + a[i][1];
	}
	for(int i = 1;i <= n;i ++)
	{
		dp[i][0][0] = sum[i][0];
		dp[i][0][1] = sum[i][1];
	}
	ans = max(dp[n][0][1] , dp[n][0][0]);
	for(int i = 1;i <= n;i ++)
	{
		dp[i][1][0] = sum[i - 1][1] + sum[n][0] - sum[i - 1][0];
		dp[i][1][1] = sum[i - 1][0] + sum[n][1] - sum[i - 1][1];
	}
	ans = max(ans , max(dp[n][1][0] , dp[n][1][1]));
	for(int j = 2;j <= k;j ++)
	{
		int Max0 ,Max1;
		Max0 = Max1 = -0x3f3f3f3f3f3f3f3f;
		deque<int> que0,que1;
		for(int i = j;i <= n;i ++)
		{
			dp[i][j & 1][0] = dp[i][j & 1][1] = -0x3f3f3f3f3f3f3f3f;
		}
		que0.push_back(j - 1);
		que1.push_back(j - 1);
		for(int i = j;i <= n;i ++)
		{
			while(que0.size() && que0.front() < i - t) que0.pop_front();
			while(que1.size() && que1.front() < i - t) que1.pop_front();
			if(que1.size())
			{
				dp[i][j & 1][0] = max(max(dp[i][j & 1][0] , Max1 + a[i][0] + sum[i - 1][1]), dp[que1.front()][(j - 1) & 1][1] + p + a[i][0] + sum[i - 1][1] - sum[que1.front()][1]);
			}
			else
			{
				dp[i][j & 1][0] = max(dp[i][j & 1][0] , Max1 + a[i][0] + sum[i - 1][1]);
			}
			if(que0.size())
			{
				dp[i][j & 1][1] = max(max(dp[i][j & 1][1] , Max0 + a[i][1] + sum[i - 1][0]), dp[que0.front()][(j - 1) & 1][0] + p + a[i][1] + sum[i - 1][0] - sum[que0.front()][0]);
			}
			else
			{
				dp[i][j & 1][1] = max(dp[i][j & 1][1] , Max0 + a[i][1] + sum[i - 1][0]);
			}
			ans = max(ans , max(dp[i][j & 1][0] + sum[n][0] - sum[i][0] , dp[i][j & 1][1] + sum[n][1] - sum[i][1]));
			while(que0.size() && dp[que0.back()][(j - 1) & 1][0] - sum[que0.back()][0] < dp[i][(j - 1) & 1][0] - sum[i][0]) que0.pop_back();
			while(que1.size() && dp[que1.back()][(j - 1) & 1][1] - sum[que1.back()][1] < dp[i][(j - 1) & 1][1] - sum[i][1]) que1.pop_back();
			que0.push_back(i);que1.push_back(i);
			if(i > t && i - t > j)
			{
				Max0 = max(Max0 , dp[i - t][(j - 1) & 1][0] - sum[i - t][0]);
				Max1 = max(Max1 , dp[i - t][(j - 1) & 1][1] - sum[i - t][1]);
			}
		}
	}
	cout << ans << "\n";
	return ;
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	
	cin >> id >> T;
	while(T --)
	{
		work();
	} 
	
	return 0;
}

2024/11/19 16:28
加载中...