题目链接:http://codeforces.com/contest/602/problem/B

题意 :给出一个含有 n 个数的区间,要求找出一个最大的连续子区间使得这个子区间的最大值和最小值的差值不超过 1 ,最后输出这个子区间的长度。

分析 :我们可以根据区间的最值之差利用尺取的方法来找出答案=> if(差值>1) Left++; else Right++; 然后每一次右端点+1就更新一次答案直到右端点到达 n 。在这里我们需要找出区间最值,也就是经典的RMQ问题,可以利用ST算法模板进行O(nlogn)的预处理接下来进行尺取便不会超时。上述的过程完全可以使用multiset来替代,我们可以每一次把(Left, Right)区间内的数放到multiset里面,根据set容器的特性,我们能很方便得到(Left, Right)这个区间的最值,也能使用erase()在区间不满足题意进行Left++操作时将原来Left的元素在集合内剔除,也能用size()方便的得到区间的长度,但是两者都用到了尺取的思想。

瞎想 :当需要维护区间的时候需要获取最值或者获取区间长度的时候,不妨考虑能否借助set容器来实现。

Two pointers && RMQ :

#include<bits/stdc++.h>
#define LL long long
using namespace std;
;
], Min[maxn][];
inline void initialize(int & n)
{
    ; i<=n; i++) Max[i][] = arr[i], Min[i][] = arr[i];
    ; j<; j++){
        ; i<=n; i++){
            <<j) -  <= n){
                Min[i][j] = min(Min[i][j-], Min[i+(<<(j-))][j-]);
                Max[i][j] = max(Max[i][j-], Max[i+(<<(j-))][j-]);
            }
        }
    }
}
int RMQ(int L, int R)
{
    ;
    //while((1<<(k+1)) <= R-L+1) k++;
    k = log2(R-L+);
    <<k)+][k]);
    <<k)+][k]);
    return MAX - MIN;
}
int main(void)
{
    int n;
    scanf("%d", &n);
    ; i<=n; i++) scanf("%d", &arr[i]);
    initialize(n);
    , R = ;
    ;
    while(R <= n){
        int temp = RMQ(L, R);
        ){
            ans = max(R-L+, ans);
            R++;
        }
        else{
            L++;
        }
    }
    printf("%d\n", ans);
    ;
}

Two pointers && multiset :

#include<bits/stdc++.h>
using namespace std;
;
int arr[maxn];
int main(void)
{
    int n;
    scanf("%d", &n);
    ; i<=n; i++) scanf("%d", &arr[i]);
    multiset<int> s;
    s.insert(arr[]);
    ];
    ];
    , ed = ;//双指针记录Left 和 Right
    ;
    ; i<=n; i++){
        Max = max(Max, arr[i]);
        Min = min(Min, arr[i]);
        s.insert(arr[i]);
        ){
            ans = max(ans, (int)s.size());
        }else{
             && Max - Min > ){//相当于Left++操作
                set<int>::iterator it = s.find(arr[st]);
                s.erase(it);
                st++;
                set<int>::iterator it_Max = --s.end();
                set<int>::iterator it_Min = s.begin();
                Max = *it_Max;
                Min = *it_Min;
            }
            ans = max(ans, (int)s.size());
        }
    }
    printf("%d\n", ans);
    ;
}

#333 Div2 Problem B Approximating a Constant Range (尺取 && RMQ || 尺取 && multiset)的更多相关文章

  1. #333 Div2 Problem B Approximating a Constant Range(尺取法)

    题目:http://codeforces.com/contest/602/problem/B 题意 :给出一个含有 n 个数的区间,要求找出一个最大的连续子区间使得这个子区间的最大值和最小值的差值不超 ...

  2. Codeforces Round #333 (Div. 2) B. Approximating a Constant Range st 二分

    B. Approximating a Constant Range Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com ...

  3. Codeforces Round #333 (Div. 2) B. Approximating a Constant Range

    B. Approximating a Constant Range Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com ...

  4. Codeforces 602B Approximating a Constant Range(想法题)

    B. Approximating a Constant Range When Xellos was doing a practice course in university, he once had ...

  5. FZU 2016 summer train I. Approximating a Constant Range 单调队列

    题目链接: 题目 I. Approximating a Constant Range time limit per test:2 seconds memory limit per test:256 m ...

  6. cf602B Approximating a Constant Range

    B. Approximating a Constant Range time limit per test 2 seconds memory limit per test 256 megabytes ...

  7. codeforce -602B Approximating a Constant Range(暴力)

    B. Approximating a Constant Range time limit per test 2 seconds memory limit per test 256 megabytes ...

  8. 【32.22%】【codeforces 602B】Approximating a Constant Range

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  9. 【CodeForces 602C】H - Approximating a Constant Range(dijk)

    Description through n) and m bidirectional railways. There is also an absurdly simple road network — ...

随机推荐

  1. Angular5 自定义scrollbar样式之 ngx-malihu-scrollbar

    简介 此插件是 Malihu jQuery Scrollbar 为了在 Angular2+ 环境下使用,封装的一个ts的版本.提供directive和service. 从安装量来看,它比不过 perf ...

  2. python 并发编程 多线程 GIL全局解释器锁基本概念

    首先需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念. 就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码. ...

  3. python requests的content和text方法的区别【转】

    requests对象的get和post方法都会返回一个Response对象,这个对象里面存的是服务器返回的所有信息,包括响应头,响应状态码等.其中返回的网页部分会存在.content和.text两个对 ...

  4. python 链接mysql 事务

    import mysql.connector try: con = mysql.connector.connect( host="localhost", port="33 ...

  5. 文件的三种打开方式及with管理文件上下文

    文件的三种打开方式及with管理文件上下文 一.文件的三种打开方式 1.1 只读 f = open(r'D:\pycharm\yjy\上海python学习\456.txt','r',encoding= ...

  6. Node.js FS模块方法速查

    1. File System 所有文件操作提供同步和异步的两种方式,本笔记只记录异步的API 异步方式其最后一个参数是回调函数.回调函数的第一个参数往往是错误对象,如果没有发生参数,那么第一个参数可能 ...

  7. 用python 获取照片的Exif 信息(获取拍摄设备,时间,地点等信息)

    第一步:先安装 pip install exifread 第二部:上代码 import exifread import requests class PhotoExifInfo(): def __in ...

  8. 【抓包工具】使用Fiddler关于“由于目标计算机积极拒绝,无法连接。”的解决方案

    今天使用Fiddler的时候遇到下面这个问题:在地址栏想打开个一般处理程序,出现连接本机失败的提示,如下图: 而这在我没打开Fiddler的时候是显示正常的. 查看Fiddler,在嗅探 -> ...

  9. linux设置用户自定义别名

    设置用户自定义别名 首先进入当前用户家目录 我这里是 root 查看隐藏文件 注意到.bashrc文件,修改此可以用户自定义别名 保存退出,读入.bashrc设定 看看alias里有没 以后此用户就永 ...

  10. C Make a Square Educational Codeforces Round 42 (Rated for Div. 2) (暴力枚举,字符串匹配)

    C. Make a Square time limit per test2 seconds memory limit per test256 megabytes inputstandard input ...