codeforces 332B B. Maximum Absurdity(rmq)
题目链接:
codeforces 332B
题目大意:
给出一个序列,让找出不互相覆盖的两个长度为k的段,问在两个段的权值和最大的情况下,按照左边段的左端点排序,右边段的左端点作为第二关键字排序,得到的第一个答案。
题目分析:
- 很水的数据结构的题目,我们只需要先利用前缀和预处理出所有长度为k的段的总权值。然后利用rmq维护区间最大值和得到这个最大值取得的段的最左位置。
- 然后我们枚举第二段的位置,然后找到在采用当前段的前提下,第一段能取得的最大最左的情况,利用rmq的查询即可。
AC代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#define MAX 200007using namespace std;typedef long long LL;
typedef pair<long long , int > PII;int n,k;
LL a[MAX],b[MAX];
LL dp[MAX][30];
LL ans[MAX][30];void make ( )
{
for ( int i = 1 ; i <= n ; i++ )
{ dp[i][0] = b[i];
ans[i][0] = i;
}
for ( int j = 1 ; (1<<j) <= n ; j++ )
for ( int i = 1 ; i+(1<<j)-1 <= n ; i++ )
{ dp[i][j] = max ( dp[i][j-1] , dp[i+(1<<(j-1))][j-1] );
if ( dp[i][j-1] == dp[i][j] ) ans[i][j] = ans[i][j-1];
else ans[i][j] = ans[i+(1<<(j-1))][j-1];
}
}PII query ( int l , int r )
{int k = (int)((log((r-l+1)*1.0))/log(2.0));LL maxn;int temp;maxn = max ( dp[l][k] , dp[r-(1<<k)+1][k] );if ( maxn == dp[l][k] ) temp = ans[l][k];else temp = ans[r-(1<<k)+1][k];return make_pair ( maxn , temp );
}int main ( )
{
while ( ~scanf ( "%d%d" , &n , &k ) )
{ a[0] = 0;
for ( int i = 1 ; i <= n ; i++ )
{ scanf ( "%lld" , &a[i] );
a[i] += a[i-1];
}
for ( int i = k ; i <= n ; i++ )
b[i] = a[i]-a[i-k];
make ( );
int loc =-1;
PII temp = make_pair ( 0 , 0 );
for ( int i = 2*k ; i <= n ; i++ )
{ PII tmp = query ( k , i-k );
if ( tmp.first + b[i] > temp.first )
{ temp = tmp;
temp.first += b[i];
loc = i;
}
}
temp.second -= k-1;
loc -= k-1;
printf ( "%d %d\n" , (int)temp.second , loc );
}
}
codeforces 332B B. Maximum Absurdity(rmq)相关推荐
- 【CodeForces 332B --- Maximum Absurdity】递推
[CodeForces 332B --- Maximum Absurdity]递推 题目来源:点击进入[CodeForces 332B - Maximum Absurdity] Description ...
- [CodeForces 332B]Maximum Absurdity[DP]
题目链接: [CodeForces 332B]Maximum Absurdity[DP] 题意分析: 寻找两个不重叠的长度为k的子串,使得它们之和最大. 解题思路: 第一想法是,处理出从这个点开始,长 ...
- Maximum Absurdity(dp思想+前缀和)
Maximum Absurdity 原题目:Maximum Absurdity 题解 处理长度为 k 的区间和用前缀和 处理不相交的两个区间和用 dp 思想,以 i 为界线,用四个数组分别记录位置 i ...
- CodeForces 332B Maximum Absurdity
http://codeforces.com/problemset/problem/332/B 给出n个数,再个一个长度,问在n个数的数列中,找到2个相应长度的数串求和最大,且这两个数串不能重叠.只要对 ...
- Codeforces 332B Maximum Absurdity(DP+前缀和处理)
题目链接:http://codeforces.com/problemset/problem/332/B 题目大意: 给你n个数和一个整数k,要求找到不相交的两个长度为k的区间,使得区间和最大,输出这两 ...
- CodeForces - 332B Maximum Absurdity 前缀和
这道题主要用的前缀和的思想,看了网上大佬的代码感觉很巧妙.我之前有好几个点没注意,WA了好几次,还有就是要用long long类型.不多说了,直接贴AC代码: #include<cstdio&g ...
- Codeforces 332B Maximum Absurdity(暴力)
题意: 给你一个序列,让你在里面选择两个不想交的长度为k的字段,是的和最大. 我第一次做还是用的dp,感觉复杂度有点高啊,后来发现直接预处理就好了. 预处理需要三个数组,分别是sum[i],Max[i ...
- CodeForces 332B Maximum Absurdity(线段树单点更新)
题意: 给你一个序列,找两个长度为 k 且没有重合区间的数使得其和最大 解析: 线段树,就是把起点为 i 长度为 k 的和预处理出来,再枚举a,与a线段不重合的,后面的部分用线段树来找最大位置,总复杂 ...
- codeforces 332b Maximum Absurdity dp
题意: 有n个数,找两个段(每个段长度为k)不相交,求出这两个段的和的最大值. 输出两个段的起始下标. 思路: dp[i][j]:走到i,已经选了j个段的最大值. 转移:dp[i][j] = dp[i ...
最新文章
- linux 安装 tao环境,linux环境安装hbase------不一定需要hadoop
- linux运维工程师
- android camera入门,android 基础一 Camera1 预览、拍照
- Python面试题-朋友昨天去面试,这5个Python面试题都被考到了,太神奇了!
- Java多线程初学者指南(12):使用Synchronized块同步变量
- layui设置radio
- mysql 前沿表设计_史上最简单MySQL教程详解(基础篇)之表的维护和改造
- P3200 [HNOI2009]有趣的数列
- MDX Cookbook 08 - 基于集合上的迭代递归
- 树枝学术 | 论文翻译全攻略
- Fiddler详解-Fiddler Classic
- 【优化系列】龙芯loongson简介
- 疫情又又又来了,看我爬取京东6000款口罩,来看看那一款最适合你
- java method field_java_解析Java中的Field类和Method类,Field类
Field类中定义了一些方 - phpStudy...
- 恐怖啊,MD5已经被真实情况下破解了
- 系统服务管理知识-进程守护工具:supervisor
- Unity手机震动,Unity -> android 震动
- php调用翻译,PHP调用有道词典翻译API实现翻译功能及代码
- 41页大数据治理平台建设与应用解决方案(附下载)
- HackerRank Company Logo
热门文章
- Tennessee Eastman(TE过程)简介
- IO子系统(一) — 块设备驱动程序
- Video.js中m3u8视频清晰度切换
- 计算机组成与结构数据通路实验
- 使用DiskMan(DiskGen)恢复被删除的分区
- 计算机系统基础知识——循环冗余校验码(CRC)
- Fairplay之streamingContentKeyRequestDataForApp makeStreamingContentKeyRequestDataForApp
- 准确率、召回率、F值
- 如何把Java代码写的简洁
- Bacteria(优先队列)