题目链接:

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)相关推荐

  1. 【CodeForces 332B --- Maximum Absurdity】递推

    [CodeForces 332B --- Maximum Absurdity]递推 题目来源:点击进入[CodeForces 332B - Maximum Absurdity] Description ...

  2. [CodeForces 332B]Maximum Absurdity[DP]

    题目链接: [CodeForces 332B]Maximum Absurdity[DP] 题意分析: 寻找两个不重叠的长度为k的子串,使得它们之和最大. 解题思路: 第一想法是,处理出从这个点开始,长 ...

  3. Maximum Absurdity(dp思想+前缀和)

    Maximum Absurdity 原题目:Maximum Absurdity 题解 处理长度为 k 的区间和用前缀和 处理不相交的两个区间和用 dp 思想,以 i 为界线,用四个数组分别记录位置 i ...

  4. CodeForces 332B Maximum Absurdity

    http://codeforces.com/problemset/problem/332/B 给出n个数,再个一个长度,问在n个数的数列中,找到2个相应长度的数串求和最大,且这两个数串不能重叠.只要对 ...

  5. Codeforces 332B Maximum Absurdity(DP+前缀和处理)

    题目链接:http://codeforces.com/problemset/problem/332/B 题目大意: 给你n个数和一个整数k,要求找到不相交的两个长度为k的区间,使得区间和最大,输出这两 ...

  6. CodeForces - 332B  Maximum Absurdity   前缀和

    这道题主要用的前缀和的思想,看了网上大佬的代码感觉很巧妙.我之前有好几个点没注意,WA了好几次,还有就是要用long long类型.不多说了,直接贴AC代码: #include<cstdio&g ...

  7. Codeforces 332B Maximum Absurdity(暴力)

    题意: 给你一个序列,让你在里面选择两个不想交的长度为k的字段,是的和最大. 我第一次做还是用的dp,感觉复杂度有点高啊,后来发现直接预处理就好了. 预处理需要三个数组,分别是sum[i],Max[i ...

  8. CodeForces 332B Maximum Absurdity(线段树单点更新)

    题意: 给你一个序列,找两个长度为 k 且没有重合区间的数使得其和最大 解析: 线段树,就是把起点为 i 长度为 k 的和预处理出来,再枚举a,与a线段不重合的,后面的部分用线段树来找最大位置,总复杂 ...

  9. codeforces 332b Maximum Absurdity dp

    题意: 有n个数,找两个段(每个段长度为k)不相交,求出这两个段的和的最大值. 输出两个段的起始下标. 思路: dp[i][j]:走到i,已经选了j个段的最大值. 转移:dp[i][j] = dp[i ...

最新文章

  1. linux 安装 tao环境,linux环境安装hbase------不一定需要hadoop
  2. linux运维工程师
  3. android camera入门,android 基础一 Camera1 预览、拍照
  4. Python面试题-朋友昨天去面试,这5个Python面试题都被考到了,太神奇了!
  5. Java多线程初学者指南(12):使用Synchronized块同步变量
  6. layui设置radio
  7. mysql 前沿表设计_史上最简单MySQL教程详解(基础篇)之表的维护和改造
  8. P3200 [HNOI2009]有趣的数列
  9. MDX Cookbook 08 - 基于集合上的迭代递归
  10. 树枝学术 | 论文翻译全攻略
  11. Fiddler详解-Fiddler Classic
  12. 【优化系列】龙芯loongson简介
  13. 疫情又又又来了,看我爬取京东6000款口罩,来看看那一款最适合你
  14. java method field_java_解析Java中的Field类和Method类,Field类 Field类中定义了一些方 - phpStudy...
  15. 恐怖啊,MD5已经被真实情况下破解了
  16. 系统服务管理知识-进程守护工具:supervisor
  17. Unity手机震动,Unity -> android 震动
  18. php调用翻译,PHP调用有道词典翻译API实现翻译功能及代码
  19. 41页大数据治理平台建设与应用解决方案(附下载)
  20. HackerRank Company Logo

热门文章

  1. Tennessee Eastman(TE过程)简介
  2. IO子系统(一) — 块设备驱动程序
  3. Video.js中m3u8视频清晰度切换
  4. 计算机组成与结构数据通路实验
  5. 使用DiskMan(DiskGen)恢复被删除的分区
  6. 计算机系统基础知识——循环冗余校验码(CRC)
  7. Fairplay之streamingContentKeyRequestDataForApp makeStreamingContentKeyRequestDataForApp
  8. 准确率、召回率、F值
  9. 如何把Java代码写的简洁
  10. Bacteria(优先队列)