Codeforces Gym 101498K. Two Subarrays
2018-02-27 10:15
357 查看
题目:
http://codeforces.com/gym/101498/problem/K
题意:
一个数组的stength这样定义:
给定一个数组,求两个互不相交的子数组的strength差值的绝对值的最大值
分析:
由于n到了1e5,T又有1e2,所以应该是一个O(n)的算法或者O(nlogn)的算法;
这里用O(n)的DP;
lf[i][2]:以i开头,奇/偶数个项的最大值
(lf[i][0]:以i开头,偶数个项的最大值 lf[i][1]:以i开头,奇数个项的最大值)
lg[i][2]:以i开头,奇/偶数个项的最小值
rf[i][2]:以i结尾,奇/偶数个项的最大值
rg[i][2]:以i开头,奇/偶数个项的最小值
代码:
http://codeforces.com/gym/101498/problem/K
题意:
一个数组的stength这样定义:
给定一个数组,求两个互不相交的子数组的strength差值的绝对值的最大值
分析:
由于n到了1e5,T又有1e2,所以应该是一个O(n)的算法或者O(nlogn)的算法;
这里用O(n)的DP;
lf[i][2]:以i开头,奇/偶数个项的最大值
(lf[i][0]:以i开头,偶数个项的最大值 lf[i][1]:以i开头,奇数个项的最大值)
lg[i][2]:以i开头,奇/偶数个项的最小值
rf[i][2]:以i结尾,奇/偶数个项的最大值
rg[i][2]:以i开头,奇/偶数个项的最小值
代码:
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int tmax=1e5+5; ll a[tmax],lf[tmax][2],lg[tmax][2],rf[tmax][2],rg[tmax][2],top,low,ans; int n; int main() { int T,i; scanf("%d",&T); while(T--) { scanf("%d",&n); for(i=1;i<=n;i++) scanf("%I64d",&a[i]); lf [0]=lg [0]=0; lf [1]=lg [1]=a ; rf[1][0]=rg[1][0]=0; rf[1][1]=rg[1][1]=a[1]; for(i=n-1;i>=1;i--) { lf[i][0]=max((ll)0,a[i]-lg[i+1][1]); lf[i][1]=max((ll)0,-lg[i+1][0])+a[i]; lg[i][0]=min((ll)0,a[i]-lf[i+1][1]); lg[i][1]=min((ll)0,-lf[i+1][0])+a[i]; } for(i=2;i<=n;i++) { rf[i][0]=max((ll)0,rf[i-1][1]-a[i]); rf[i][1]=max((ll)0,rf[i-1][0])+a[i]; rg[i][0]=min((ll)0,rg[i-1][1]-a[i]); rg[i][1]=min((ll)0,rg[i-1][0])+a[i]; } top=low=a[1]; ans=0; for(i=2;i<=n;i++) { ans=max(ans,abs(lf[i][0]-low)); ans=max(ans,abs(lf[i][1]-low)); ans=max(ans,abs(lg[i][0]-top)); ans=max(ans,abs(lg[i][1]-top)); top=max(top,rf[i][0]); top=max(top,rf[i][1]); low=min(low,rg[i][0]); low=min(low,rg[i][1]); } cout<<ans<<endl; } return 0; }
相关文章推荐
- CodeForcesGym 100753F Divisions
- 【中途相遇法】【STL】BAPC2014 K Key to Knowledge (Codeforces GYM 100526)
- CodeForcesGym 100524J Jingles of a String
- 【Codeforces Gym】100162 H Temperature
- 【模拟】NEERC15 J Jump(2015-2016 ACM-ICPC)(Codeforces GYM 100851)
- 【模拟】ECNA 2015 I What's on the Grille? (Codeforces GYM 100825)
- [构造] Codeforces Gym 101190 NEERC 16 C. Cactus Construction
- [构造] Codeforces Gym 101173 CERC 16 K & BZOJ 4796 Key Knocking
- Codeforces Gym 100800J Jelly Raid (暴搜)
- Codeforces Gym 100623H Problem H. Holes
- Codeforces Gym 101138C Stickmen 暴力搜索+组合数
- Codeforces gym 101102 D 单调栈
- Codeforces Gym 100187M M. Heaviside Function two pointer
- Codeforces Gym 100463A Crossings 逆序数
- Codeforces Gym 100513G G. FacePalm Accounting
- codeforces Gym 100500H A. Potion of Immortality 简单DP
- CodeForces Gym 100500A A. Poetry Challenge DFS
- Codeforces Gym 100418K Cards 组合数学
- Codeforces GYM 100803F
- Codeforces Gym 101234D Forest Game