C. Ultimate Value,出自Codeforces Round 1049 (Div. 2)

题目链接:https://codeforces.com/problemset/problem/2140/C
解题思路:博弈论一定要找出博弈在哪里。博弈的思想往往是简单的,只需要考虑最近一步就可以了。我一开始是想A有轮椅打法就是同奇偶位置交换它是净赚的,B就得选择最佳的位置交换了。但是多想一步,B即便选了收益最大的交换方式,A可以把它换回来,这样A还是净赚的。所以B只能选择终止。这样问题就只有A一步的操作了。我们要找到A的第一步最佳策略。就是看是2(a
l−ar)+r−l或者反过来谁最大。这种由两个组成的重要解题方法是:先找一半最大的和另一半最大的。然后二者再分别对对方循环来一遍 ,就可以从o(n2)降到o(n)了。

#include<bits/stdc++.h>
using namespace std;
#define int long long

const int N=2e5+2;
int a[N],mn[N],mx[N];

signed main(){
	int t;cin>>t;
	while(t--){
		int n;cin>>n;int sum=0;
		for(int i=1; i<=n; i++){
			cin>>a[i];
			sum+=(i%2)?a[i]:-a[i];
			if(i==1) mn[1]=1+2*a[1];
			else if(i%2) mn[i]=min(mn[i-2],i+2*a[i]);
			else mx[i]=max(mx[i-2],2*a[i]-i);
		}
		// r 奇 l 偶,2a_l-l-2a_r+r
		// r 偶 l 奇,2a_r+r-2a_l-l 
		int ans=n-2+(n%2);
		for(int i=1; i<=n; i++){
			if(i%2) ans=max(ans,mx[i-1]-2*a[i]+i);
			else ans=max(ans,2*a[i]-mn[i-1]+i);
		}
		cout<<ans+sum<<"\n";
	}
    return 0;
}
posted @ 2026-01-16 02:11  曾翎一  阅读(3)  评论(0)    收藏  举报