• 20161005 NOIP 模拟赛 T2 解题报告


    beautiful


    2.1 题目描述

    一个长度为 n 的序列,对于每个位置 i 的数 ai 都有一个优美值,其定义是:找到序列中最 长的一段 [l, r],满足 l ≤ i ≤ r,且 [l, r] 中位数为 ai(我们比较序列中两个位置的数的大小时, 以数值为第一关键字,下标为第二关键字比较。这样的话 [l, r] 的长度只有可能是奇数),r - l + 1 就是 i 的优美值。 接下来有 Q 个询问,每个询问 [l, r] 表示查询区间 [l, r] 内优美值的最大值。
    2.2 输入

    第一行输入 n 接下来 n 个整数,代表 ai 接下来 Q,代表有 Q 个区间接下来 Q 行,每行 两个整数 l, r(l ≤ r),表示区间的左右端点

    2.3 输出
    对于每个区间的询问,输出答案
    2.4 Sample Input

    8

    16 19 7 8 9 11 20 16

    8

    3 8

    1 4

    2 3

    1 1

    5 5

    1 2

    2 8

    7 8
    2.5 Sample Output

    7

    3

    1

    3

    5

    3

    7

    3
    3
    2.6 数据范围及约定

    对于 30% 的数据,满足 n,Q ≤ 50

    对于 70% 的数据,满足 n,Q ≤ 2000 对于所有数据,满足 n ≤ 2000, Q ≤ 100000,ai ≤ 200

    ———————————————分割线———————————————

    考试没有理解这道题,导致连暴力都没有写出来,本题直接爆零。

    看完标程和解题报告后豁然开朗。

    n2 预处理。对于每个数,往左往右各扫一遍,遇到大于它的数则状态 S++,小于则 S--, 由题目定义可知没有相等的。然后记录下每个状态 S 的最长长度,然后枚举左边的状态,找右边的状态,取 max 计算出优美值。 接着就是一个纯 RMQ 的问题了.

     1 #include "cstdio"
     2 #include "cstring"
     3 #include "iostream"
     4 
     5 using namespace std ;
     6 const int maxN = 10010 ;
     7 const int INF = 2147483647 ;
     8 typedef long long QAQ ;
     9 
    10 int L[ maxN ] , R[ maxN ] , w[ maxN ] , A[ maxN ] ;
    11 
    12 inline int max ( int x , int y ) { return x < y ? y : x ;}
    13 
    14 void Init ( int n ) {
    15         for ( int i=1 ; i<=n ; ++i ) {
    16                 memset ( L , 255 , sizeof ( L ) ) ;
    17                 memset ( R , 255 , sizeof ( R ) ) ;
    18                 L[ n ] = 0 ; R[ n ] = 0 ;
    19                 int _cnt = 0 ; 
    20                 
    21                 for ( int j = i - 1 ; j>=1 ; --j ) {
    22                         if ( A[ j ] > A[ i ] ) ++_cnt ;
    23                         else if ( A[ j ] <= A[ i ] ) --_cnt ;
    24                         L[ n + _cnt ] = i - j ;
    25                 }
    26                 
    27                 _cnt = 0 ;
    28                 for ( int j = i + 1 ; j <= n ; ++j ) {
    29                         if ( A[ j ] >= A[ i ] ) ++_cnt ;
    30                         else if ( A[ j ] < A[ i ] ) --_cnt ;
    31                         R[ n + _cnt ] = j - i ;
    32                 }
    33                 
    34                 for ( int j = 1 - i ; j <= i - 1 ; ++j ) {
    35                         if ( L[ n + j ] >= 0 && R[ n - j ] >= 0 ) {
    36                                 w [ i ] = max ( w [ i ] , L[ n + j ] + R[ n - j ] + 1 ) ;
    37                         }
    38                 }
    39         }
    40 }
    41 int main ( ) {
    42         int N , T , l , r ;
    43         scanf ( "%d" , &N ) ;
    44         for ( int i=1 ; i<=N ; ++i ) {
    45                 scanf ( "%d" , A + i ) ;
    46         }
    47         Init ( N ) ;
    48         scanf ( "%d" , &T ) ;
    49         while ( T-- ) {
    50                 QAQ ans = -INF ;
    51                 cin >> l >> r ;
    52                 for ( int i=l ; i<=r ; ++i ) ans = max ( ans , w[ i ] ) ;
    53                 printf ( "%I64d
    " , ans ) ;
    54         }
    55 } 
    Beauitiful

    NOIP_RP++;

    2016-10-08 00:18:20

    (完)

  • 相关阅读:
    【ST】lab01——Junit and Eclemma
    【SPM】hw1——个人房间装修
    【ST】hw2——find the error in the follow case
    【ST】Describe an error from my past projects
    ST homework4 --- 图覆盖
    ST lab1——Junit和覆盖测试的初探
    ST work12——failure,fault,error
    ST work1——印象最深的一个bug DJI 激活时报 SDK_ACTIVE_SDK_VERSION_ERROR
    C# note 06——delegate 和 event
    C# note 05——异常处理
  • 原文地址:https://www.cnblogs.com/shadowland/p/5937206.html
Copyright © 2020-2023  润新知