[codeforces 1373D] Maximum Sum on Even Positions 翻转不改变相对位置+两种交换形式

Educational Codeforces Round 90 (Rated for Div. 2)   参与排名人数12840

[codeforces 1373D]    Maximum Sum on Even Positions  翻转不改变相对位置+两种交换形式

总目录详见https://blog.csdn.net/mrcrack/article/details/103564004

在线测评地址http://codeforces.com/contest/1373/problem/D

Problem Lang Verdict Time Memory
D - Maximum Sum on Even Positions GNU C++17 Accepted 93 ms 4400 KB

题目大意:给定一个数组,可以至多对其中的连续子序列进行一次翻转,求出所有可能中的,该数组偶数位置上的元素最大和。

样例模拟如下

8
1 7 3 4 7 6 2 9

26

位置0 1 2 3 4 5 6 7
数值1 7 3 4 7 6 2 9
翻转后位置区间[0,7]对应的元素

翻转后
位置0 1 2 3 4 5 6 7
数值9 2 6 7 4 3 7 1

偶数位上元素和9+6+4+7=26

5
1 2 1 2 1

5

位置0 1 2 3 4
数值1 2 1 2 1
翻转后位置区间[0,3]对应的元素

翻转后
位置0 1 2 3 4
数值2 1 2 1 1 

偶数位上元素和2+2+1=5

10
7 8 4 5 7 6 8 9 7 3

37

位置0 1 2 3 4 5 6 7 8 9
数值7 8 4 5 7 6 8 9 7 3
翻转后位置区间[1,2]对应的元素

翻转后
位置0 1 2 3 4 5 6 7 8 9
数值7 4 8 5 7 6 8 9 7 3

偶数位上元素和7+8+7+8+7=37

4
3 1 2 1

5

位置0 1 2 3
数值3 1 2 1

偶数位上元素和3+2=5

可以看到,翻转不改变元素间相对位置。

如位置0 1 2 3 4,位置1可与位置0交换,也可与位置2交换,需要讨论两种交换形式。

交换后,偶数位和值,只需在原来和值的基础上,补上差值即可。

AC代码如下:

#include 
#include 
#define LL long long
#define maxn 200010
using namespace std;
int a[maxn];
LL sum;
int main(){
	int t,i,n;
	LL cur,delta1,delta2,delta;
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		for(i=0;i

 

你可能感兴趣的:(codeforces)