Codeforces Round #193 (Div. 2) B. Maximum Absurdity (DP、RMQ两种解法)
来源:互联网 发布:淘宝怎么开直播间 编辑:程序博客网 时间:2024/06/08 07:03
题意:求两段长度为k的子列的最大和,两段不能相交,输出两个子列的开始位置。
思路(1):DP的思想,枚举第二个子列的开始位置。维护这个位置前的长度为k的子列的最大值就够了。
复杂度:O(n)
代码:
#include <cstdio>#include <cstring>#define maxn 200005using namespace std;int n,m,k;long long a[maxn],sum[maxn];int main(){ int i,j,s,st,e; long long ma,t,tmp,prema; scanf("%d%d",&n,&k); sum[0]=0; for(i=1;i<=n;i++) // sum存前n项和 { scanf("%I64d",&a[i]); sum[i]=sum[i-1]+a[i]; } ma=-1; prema=-1; for(j=k+1;j<=n-k+1;j++) { t=sum[j+k-1]-sum[j-1]; // 枚举子列二 tmp=sum[j-1]-sum[j-k-1]; if(tmp>prema) // 维护子列一的最大值 { s=j-k; prema=tmp; } if(prema+t>ma) { st=s; // 注意这行必须有 不能直接输出s、e 因为最大值没有更新时s也可能在变 e=j; ma=prema+t; } } printf("%d %d\n",st,e); return 0;}
思路(2):RMQ,枚举子列一,查询子列二的最大值。(RMQ的查询可以达到O(1))
复杂度:RMQ初始化O(n*lg(n))+O(n)
代码:
#include <iostream>#include <cstdio>#include <cstring>#define maxn 300005using namespace std;int n,m,mm,k,ans,t;long long a[maxn],sum[maxn];long long f[maxn][64];long long maxx(long long x1,long long x2){ return x1<x2?x2:x1;}void init(){ int i,j; mm=n-k+1; for(i=1;i<=mm;i++) { f[i][0]=sum[i]; } for(j=1;(1<<j)<=mm;j++) { for(i=1;i+j-1<=mm;i++) { f[i][j]=maxx(f[i][j-1],f[i+(1<<(j-1))][j-1]); // 数组得开大一点 不然这里可能越界 } }}long long query(int l,int r){ t=0; while((1<<(t+1))<=r-l+1) t++; return maxx(f[l][t],f[r-(1<<t)+1][t]);}int main(){ int i,j,s,e; long long ma,tmp; scanf("%d%d",&n,&k); sum[1]=0; for(i=1;i<=n;i++) { scanf("%I64d",&a[i]); if(i<=k) sum[1]+=a[i]; } for(i=2;i<=n-k+1;i++) // sum[i]存 a[i]~a[i+k-1] 的和 { sum[i]=sum[i-1]-a[i-1]+a[i+k-1]; } init(); m=n-2*k+1; ma=-1; for(i=1;i<=m;i++) // 枚举第一段 查询第二段 扫描一遍可以得到s和ma { tmp=sum[i]+query(i+k,n-k+1); if(tmp>ma) { s=i; ma=tmp; } } tmp=ma-sum[s]; for(i=s+k;i<=n-k+1;i++) // 根据s、ma就很好得到e了 { if(sum[i]==tmp) { e=i; break ; } } printf("%d %d\n",s,e); return 0;}
- Codeforces Round #193 (Div. 2) B. Maximum Absurdity (DP、RMQ两种解法)
- Codeforces Round #193 (Div. 2) B. Maximum Absurdity
- Codeforces Round #193 (Div. 2) B. Maximum Absurdity
- codeforces 332B B. Maximum Absurdity(rmq)
- codeforces 332b Maximum Absurdity dp
- [CodeForces 332B]Maximum Absurdity[DP]
- Codeforces 332B Maximum Absurdity(暴力)
- CodeForces 332B Maximum Absurdity
- CodeForces 332B Maximum Absurdity
- CodeForces 332B Maximum Absurdity(线段树单点更新)
- Codeforces Round #172 (Div. 2)---D. Maximum Xor Secondary(RMQ + 二分)
- Codeforces Round #221 (Div. 1) B. Maximum Submatrix 2 dp排序
- CF 332 B.Maximum Absurdity【DP】
- RMQ Codeforces Round #322 (Div. 2) B. Luxurious Houses
- Codeforces Round #338 (Div. 2)B. Longtail Hedgehog(DP)
- CodeForces 332 B. Maximum Absurdity 动规 求和最大的两段连续子列
- Codeforces Round #276 (Div. 1) B. Maximum Value(哈兮)
- B. Maximum Absurdity
- spring错误
- MYSQL中delete删除多表数据 .
- 理解linux虚拟文件系统VFS - 概述
- poj 1042 Gone Fishing
- VLC源码分析总结
- Codeforces Round #193 (Div. 2) B. Maximum Absurdity (DP、RMQ两种解法)
- 固定表格行列(expression)
- JSTL AND EL
- jquery实现循环中的暂停
- myeclipse 9.0 M1安装插件
- DNS服务的学习
- 提升博客内容吸引力须知的十个秘诀
- Oracle 中创建数据库表 随表添加外键约束的方法
- 关于Filter过滤器解决乱码的使用方法