Two Subarrays Gym
来源:互联网 发布:神回复知乎 编辑:程序博客网 时间:2024/06/07 00:58
http://codeforces.com/gym/101498/problem/K
题意:
给出一个数列。
定义连续子序列的权值为
要求你求出两个不想交自序列的最大差值。
思路:
两次DP。
long long dmax[MAX][2];// dp[i][j]表示以第i个数结尾的长度为奇数/偶数的连续子序列最大值long long dmin[MAX][2];//dp[i][j]表示以第i个数结尾的长度为奇数/偶数的连续子序列最小值long long cmax[MAX][2];// dp[i][j]表示以第i个数结尾的长度为奇数/偶数的第二个连续子序列最小值和第一个序列的做大差值 第一个序列大long long cmin[MAX][2];// 、、、、、、 第一个序列小
#include <algorithm>#include <cstdio>#include <cstring>#include<iostream>#include<string>#include <cstdlib>#include<queue>#include<set>using namespace std;const int MAX=2*1e5+7;long long dmax[MAX][2];// dp[i][j]表示以第i个数结尾的长度为奇数/偶数的连续子序列最大值long long dmin[MAX][2];long long cmax[MAX][2];long long cmin[MAX][2];long long str[MAX];const long long INF=0x3f3f3f3f3f3f3f3f;int main(){ int T; scanf("%d",&T); while(T--) { int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%lld",&str[i]); for(int i=0;i<=n;i++) { dmax[i][1]=dmax[i][0]=-INF; dmin[i][1]=dmin[i][0]=INF; cmax[i][1]=cmax[i][0]=-INF; cmin[i][1]=cmin[i][0]=INF; } for(int i=1;i<=n;i++) { dmax[i][1]=max(dmax[i-1][0]+str[i],str[i]);// 1为奇数 0为偶数 if(i>1) dmax[i][0]=dmax[i-1][1]-str[i]; dmin[i][1]=min(dmin[i-1][0]+str[i],str[i]);// 1为奇数 0为偶数 if(i>1) dmin[i][0]=dmin[i-1][1]-str[i]; /*printf("dmax[%d][%d]=%lld\n",i,1,dmax[i][1]); printf("dmax[%d][%d]=%lld\n",i,0,dmax[i][0]); printf("dmin[%d][%d]=%lld\n",i,1,dmin[i][1]); printf("dmin[%d][%d]=%lld\n",i,0,dmin[i][0]);*/ } long long maxs=-INF,mins=INF; long long cntm=-INF,cnti=INF; for(int i=2;i<=n;i++) { cntm=max(cntm,max(dmax[i-1][1],dmax[i-1][0])); cmax[i][1]=max(cmax[i-1][0]-str[i],cntm-str[i]); if(i>2) cmax[i][0]=cmax[i-1][1]+str[i]; maxs=max(maxs,max(cmax[i][1],cmax[i][0])); cnti=min(cnti,min(dmin[i-1][1],dmin[i-1][0])); cmin[i][1]=min(cmin[i-1][0]-str[i],cnti-str[i]); if(i>2) cmin[i][0]=cmin[i-1][1]+str[i]; mins=min(mins,min(cmin[i][1],cmin[i][0])); //printf("cmax[%d][%d]=%lld\n",i,1,cmax[i][1]); //printf("cmax[%d][%d]=%lld\n",i,0,cmax[i][0]); //printf("cmin[%d][%d]=%lld\n",i,1,cmin[i][1]); //printf("cmin[%d][%d]=%lld\n",i,0,cmin[i][0]); } cout<<max(maxs,-mins)<<endl; }}
阅读全文
0 0
- Two Subarrays Gym
- gym-101532 A Subarrays Beauty
- Gym 100187E - Two Labyrinths
- Gym 100971F Two Points
- GYM 100488 Two Pirates(想法)
- GYM 100488 F.Two Envelopes(水~)
- GYM 100488 K.Two Pirates(set)
- GYM 100971 F.Two Points(三分)
- Beautiful Subarrays
- GYM 100090 A. After Two Hares(水~)
- GYM 100488 L.Two Heads Are Better(链表)
- Gym
- Gym
- Gym
- Gym
- Gym
- Gym
- Gym
- 在Xshell中使用sz、rz进行本机和远程主机(或虚拟机)之间文件的传输
- MySQL数据库优化的八种方式(经典必看)
- 腾讯 Bugly 和 CrashHandler 冲突,不上传日志
- Ubuntu下Android Studio真机测试解决办法
- java 中Properties类的操作
- Two Subarrays Gym
- R语言数据可视化
- Postman持续集成思路:Xshell实现Windows上传文件到Linux主机
- Spring01---简单配置
- Openacs JavaScript 脚本
- 生成不同类型的验证码类
- 刷题报告006 洛谷P1030&1031
- JAVA-初步认识-第二章-类型运算细节
- 环境配置