Codeforces Round #333 (Div. 2)B. Approximating a Constant Range(ST+二分||set暴力)
2015-11-25 16:49
417 查看
题目链接
题意:给你n个数字,然后问你,最长区间是多长(区间满足最大减去最小<=1)
解法:二分每个点往右边可以扩展多少距离,区间最大最小用ST算法
第二种解法:直接使用multiset进行暴力,思路是以i点结尾的话能够跑多远
题意:给你n个数字,然后问你,最长区间是多长(区间满足最大减去最小<=1)
解法:二分每个点往右边可以扩展多少距离,区间最大最小用ST算法
#define CF #ifndef CF #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #else #include<bits/stdc++.h> #endif // CF using namespace std; #define LL long long #define pb push_back #define X first #define Y second #define cl(a,b) memset(a,b,sizeof(a)) typedef pair<long long ,long long > P; const int maxn=100005; const int inf=1<<29; const LL mod=1e9+7; int ma[maxn][30],mi[maxn][30]; void init_rmq(int n){//初始化ST for(int j=1;j<20;j++){ for(int i=1;i+(1<<j)-1<=n;i++){ ma[i][j]=max(ma[i][j-1],ma[i+(1<<(j-1))][j-1]); mi[i][j]=min(mi[i][j-1],mi[i+(1<<(j-1))][j-1]); } } } int query(int l,int r){//查询最大值,和最小值 if(l>r)swap(l,r); int k=(int)(log(r-l+1)/log(2.0)); int a=max(ma[l][k],ma[r-(1<<k)+1][k]); int b=min(mi[l][k],mi[r-(1<<k)+1][k]); return a-b; } int bs(int l,int r){///二分每个点往右能跑多远 int m;int ll=l,rr=r; while(l+1<r){ m=(l+r)/2; if(query(ll,m)<=1)l=m; else r=m; } int ans=l-ll+1; if(query(ll,rr)<=1){ ans=max(ans,rr-ll+1); } return ans; } int main(){ int n;scanf("%d",&n); for(int i=1;i<=n;i++){ int x;scanf("%d",&x); mi[i][0]=ma[i][0]=x; } init_rmq(n); int ans=0; for(int i=1;i<=n;i++){ ans=max(ans,bs(i,n)); } printf("%d\n",ans); return 0; }
第二种解法:直接使用multiset进行暴力,思路是以i点结尾的话能够跑多远
#define CF #ifndef CF #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #else #include<bits/stdc++.h> #endif // CF using namespace std; #define LL long long #define pb push_back #define X first #define Y second #define cl(a,b) memset(a,b,sizeof(a)) typedef pair<long long ,long long > P; const int maxn=100005; const int inf=1<<29; const LL mod=1e9+7; multiset<int>s; int a[maxn]; int main(){ int n;scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d",&a[i]); } int pos=0,ans=0; for(int i=0;i<n;i++){ s.insert(a[i]); while(*s.rbegin()-*s.begin()>1){ s.erase(s.find(a[pos++])); } ans=max(ans,i-pos+1); } printf("%d\n",ans); return 0; }
相关文章推荐
- android:json解析的两个工具:Gson和Jackson的使用小例子
- AndroidIO编程
- iOS-BLE蓝牙开发
- iOS之 PJSIP静态库编译(三)
- iOS开发 内存报错 EXC_BAD_ACCESS
- android中xml tools属性详解
- Android 获取内外置存储卡方法
- iOS开发——如何做一个漂亮的引导页
- ios禁用多按钮同时点下的效果
- android发现之旅之ViewRootImpl,Activity,Window,DecorView之间的关系
- ionic省市县三级联动
- UITextField点击textField外任意区域键盘回收(一)---- [UIAppllication shareApplication]
- iOS开发多线程-GCD的常见用法
- Android动画之属性动画(二)
- android编译分析之9—dumpvar.mk
- C# 微信扫码支付 回调页面
- setVisibility()设置过度动画
- Android超简易侧滑菜单的实现
- android动画总结
- iOS开发-object-c之 @[], @{}