CF2134C
Solution
这个题看到子数组感觉很多,然后跟你 $n\le2\times 10^5$ 让人感觉是个 $n \log n$ 的做法,所以赛时想到贪心但是感觉很假,但是确实是贪心。
首先很明显的是,对于一个子数组 $l-r$ 这个范围,你如果确保了 $l-k,l\le k <r$ 是个满足条件的数组,那么你只需要考虑第 $k$ 位并且 $k$ 还是奇数。
通俗的说,就是前面的偶数位置的和要大于奇数位置了,那么后面的部分就不用考虑前面了,因为就算你加上了偶数位置一定更大。
所以我们只需要先计算两个奇数位置夹着一个偶数位置,然后看一下分别每一个偶数位置和前面的,后面的差就好了。
Code
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
#include <iomanip>
using namespace std;
using LL=long long;
LL n,f[500005],a[500005];
void solve(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
LL ans=0;
for(int i=2;i<n;i+=2){
if(a[i]<a[i-1]+a[i+1]){
LL k=a[i-1]+a[i+1]-a[i];
if(a[i+1]>=k){
a[i+1]-=k;
ans+=k;
} else{
ans+=a[i+1];
LL temp=k-a[i+1];
a[i+1]=0;a[i-1]-=temp;
ans+=temp;
}
}
}
for(int i=1;i<n;i+=2){
if(a[i]>a[i+1]){
ans+=a[i]-a[i+1];
a[i]=a[i+1];
}
}
for(int i=2;i<n;i+=2){
if(a[i]<a[i+1]){
ans+=a[i+1]-a[i];
a[i+1]=a[i];
}
}
cout<<ans<<endl;
}
int main(){
int t;
cin>>t;
while(t--) solve();
return 0;
}