洛谷 U80510 甜蜜蜜的Seaway

洛谷 U80510 甜蜜蜜的Seaway

题目传送门

题目背景

不忍看到女朋友在矩阵里迷失,FSW最后还是乖乖出来认罚qwq。为了挽回女朋友受伤的心灵,他准备给女朋友讲以前的甜蜜故事...

题目描述

FSW和女朋友情感发展的历程一共发生了N个事件(编号为1到N),每个事件都有一个甜蜜值W_i。并且,喜欢回忆的FSW把所有事件分成了K个阶段,每个阶段有一个起始事件和终止事件(用编号表示),现在,他想在每个阶段里都挑一个故事来讲,为了让女朋友尽快原谅他,他当然要挑每个阶段甜蜜值最大的那个事件,请你帮他回忆一下,在每个阶段里FSW和女朋友发生的所有故事中,最甜蜜的事件的甜蜜值是多少。

输入格式

输入文件的第一行只有一个整数N,接下来的一行,有N个整数,表示第i个事件的甜蜜值W_i。接下来的一行是一个整数K,代表FSW把所有事件分成了K个阶段。接下来的K行,每行两个整数,表示第i个阶段的起始事件和终止事件的编号。

输出格式

输出文件有K行,第i行表示在第i个阶段里最大的甜蜜值。

输入输出样例

说明/提示

数据范围:1< =N< =200000,1< =K< =10000,1<=W_i<=10^9

RMQ裸题

数据有点坑爹。

不过还是能用ST表A掉的。

存个标程:

#include<cstdio>
#include<algorithm>
using namespace std;
int n,m;
int lg[200001],two[19];
int f[200001][19];
int main()
{
    scanf("%d",&n);
    two[0]=1;
    for(int i=1;i<=n;i++)
        scanf("%d",&f[i][0]);
    for(int i=1;i<=19;i++)
        two[i]=two[i-1]<<1;
    for(int i=2;i<=n;i++)
        lg[i]=lg[i>>1]+1;
    for(int j=1;j<=19;j++)
        for(int i=1;i+two[j]-1<=n;i++)
            f[i][j]=max(f[i][j-1],f[i+two[j-1]][j-1]);
    scanf("%d",&m);
    for(int i=1;i<=m;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        int k=lg[y-x+1];
        printf("%d\n",max(f[x][k],f[y-two[k]+1][k]));
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/fusiwei/p/11281091.html