首页 > 其他分享 >codeforces 332B B. Maximum Absurdity(rmq)

codeforces 332B B. Maximum Absurdity(rmq)

时间:2023-04-23 21:33:59浏览次数:49  
标签:332B rmq temp int MAX LL include Absurdity


题目链接:

codeforces 332B


题目大意:

给出一个序列,让找出不互相覆盖的两个长度为k的段,问在两个段的权值和最大的情况下,按照左边段的左端点排序,右边段的左端点作为第二关键字排序,得到的第一个答案。


题目分析:

  • 很水的数据结构的题目,我们只需要先利用前缀和预处理出所有长度为k的段的总权值。然后利用rmq维护区间最大值和得到这个最大值取得的段的最左位置。
  • 然后我们枚举第二段的位置,然后找到在采用当前段的前提下,第一段能取得的最大最左的情况,利用rmq的查询即可。

AC代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#define MAX 200007

using 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 ); 
    }
}


标签:332B,rmq,temp,int,MAX,LL,include,Absurdity
From: https://blog.51cto.com/u_7936627/6218752

相关文章

  • HDU 5443 The Water Problem RMQ
    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5443题意:给定一个数组,查询区间最大值思路:RMQ模板题#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<queue>usingnamespacestd;constint......
  • 【rmq】洛谷P7333
    题目:P7333[JRKSJR1]JFCA-洛谷|计算机科学教育新生态(luogu.com.cn)分析:用rmq处理出各个区间长度的最大值,然后在二分区间长度找到答案(最开始想的是开长度为n的数组,对位置i的数,分别找1-(i-1)和(i+1)-n中的离i最近满足条件的位置,然后更新结果,但一直wa,还没找到问题,存疑吧)代码:......
  • RMQ问题
    #include<iostream>#include<cstring>#include<cstdio>#include<algorithm>usingnamespacestd;//这里要开2e6+10因为我们用到了Ai当下表,Ai是1<<20>1e6+10,在这被卡了好久constintN=2e6+10;intlast[N],g[N],a[N];intf[N][30],l......
  • 【RockerMQ】001-RockerMQ 概述
    【RockerMQ】001-RockerMQ概述文章目录​​【RockerMQ】001-RockerMQ概述​​​​一、MQ概述​​​​1、MQ简介​​​​2、MQ用途​​​​限流削峰​​​​异步解耦​......
  • RMQ问题的四种解法
    什么是RMQ问题:  RMQ(RangeMinimum/MaximumQuery):对于长度为n的数组A,回答若干询问RMQ(A,i,j)(i,j<=n-1),返回数组A中下标在i,j范围内的最小(大)值,也就是说,RMQ问题是指求......
  • HDU 2888 Check Corners (二维RMQ,3级)
    A-CheckCornersCrawlinginprocess...CrawlingfailedTimeLimit:10000MS    MemoryLimit:32768KB    64bitIOFormat:%I64d&%I64u​​Submit......
  • POJ 2019 Cornfields (二维RMQ,3级)
    B-CornfieldsCrawlinginprocess...CrawlingfailedTimeLimit:1000MS    MemoryLimit:30000KB    64bitIOFormat:%I64d&%I64u​​Submit​......
  • RMQ模板整理
    查询区间的最大最小值,属于离线做法,主要运用倍增+DP思想。参考书籍:算法进阶指南一维RMQ查询区间最大值或最小值//求最大值,数组下标从1开始。//求最小值,或者最大最小值下标,......
  • RMQ(Range Minimum Query)问题
    问题描述RMQ问题是求给定区间中的最值问题。对于长度为n的数列A,回答若干查询RMQ(A,i,j)。返回数组A中下标在[i,j]里的最小值的下标。比如数列5,8,1,3,6,4,9,5,7   ......
  • 【新生寒训】day 24 并查集 ST表与RMQ
    【新生寒训】day24并查集ST表与RMQ记得看看这个( ̄▽ ̄)"一些方法论:https://www.cnblogs.com/CTing/p/17067404.html今日小题https://atcoder.jp/contests/abc132/tasks/......