cf#333 (Div. 2) 区间最大最小值(RMQ || STL_set)

来源:互联网 发布:大足区广电网络 编辑:程序博客网 时间:2024/06/05 22:35

题目大意:n个数的序列,问最长的区间,区间内最大的数和最小的数差小于等于1

Sample test(s)
input
51 2 3 3 2
output
4
input
115 4 5 5 6 7 8 8 8 7 6
output
5

#include<iostream>#include<cstring>#include<algorithm>#include<cmath>using namespace std;int dp[100100][20],dp2[100100][20],s[100100];int n;void RMQ_init(){    for(int i=1; i<=n; i++) {    dp[i][0]=s[i];    dp2[i][0]=s[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]);            dp2[i][j]=min(dp2[i][j-1],dp2[i+(1<<(j-1))][j-1]);        }}int Max(int L,int R){    int k=0;    k=log2(R-L+1);    return max(dp[L][k],dp[R-(1<<k)+1][k]);}int Min(int L,int R){    int k=0;    k=log2(R-L+1);    return min(dp2[L][k],dp2[R-(1<<k)+1][k]);}int main(){int ans,i,j,l,r;scanf("%d",&n);for(i=1;i<=n;i++) scanf("%d",&s[i]);RMQ_init();l=1;r=1;ans=0;while(r<=n) {while(r<=n && Max(l,r)-Min(l,r)<=1) r++;ans=max(ans,r-l);while(Max(l,r)-Min(l,r)>1&&l<r) l++;}printf("%d\n",ans);return 0;}


#include<bits/stdc++.h>using namespace std;multiset<int>ss;multiset<int>::iterator it1,it2,it3;const int maxn=1e5+100;int a[maxn];int main(){int n,i,j,ans,p;int mx,mi;scanf("%d",&n);for(i=1;i<=n;i++) scanf("%d",&a[i]);p=1;mx=mi=a[1];ans=0;ss.insert(a[1]);for(i=2;i<=n;i++) {mx=max(mx,a[i]);mi=min(mi,a[i]);if(mx-mi<=1) {ss.insert(a[i]);ans=max(ans,(int)ss.size());continue;}ss.insert(a[i]);while(ss.size()>0&&mx-mi>1) {it1=ss.find(a[p++]);ss.erase(it1);it2=ss.begin();it3=ss.end();it3--;mi=*it2;mx=*it3;}ans=max(ans,(int)ss.size());}printf("%d\n",ans);return 0;}








0 0
原创粉丝点击