codeforces 602B Approximating a Constant Range(线段树+尺取法)
2015-12-08 14:29
447 查看
题目链接:
http://codeforces.com/problemset/problem/602/B
题目大意:
给一段长为N的序列,现在要找一段区间,要求区间里的最大值和最小值之差不超过1,问最大的区间长度是多少。
思路:
在众多的方法前,我选择了最省力又暴力的线段树= =
利用尺取法,定义左右两个指针,维护一段满足条件的最大长度的区间。然后在右指针变化过程中,一旦发现这段区间不符合条件了,就改变左指针,然后每变一次就用线段树算出新区间上面的最大和最小值,直到符合条件为止。
代码:
http://codeforces.com/problemset/problem/602/B
题目大意:
给一段长为N的序列,现在要找一段区间,要求区间里的最大值和最小值之差不超过1,问最大的区间长度是多少。
思路:
在众多的方法前,我选择了最省力又暴力的线段树= =
利用尺取法,定义左右两个指针,维护一段满足条件的最大长度的区间。然后在右指针变化过程中,一旦发现这段区间不符合条件了,就改变左指针,然后每变一次就用线段树算出新区间上面的最大和最小值,直到符合条件为止。
代码:
#include<stdio.h> #include<string.h> #define M 100005 int max(int a,int b) { return a>b?a:b; } int min(int a,int b) { return a<b?a:b; } struct tree{ int l,r,ma,mi; }tree[M<<2]; int a[M]; void pushup(int i) { if(tree[i].l==tree[i].r)return; tree[i].ma=max(tree[i<<1].ma,tree[i<<1|1].ma); tree[i].mi=min(tree[i<<1].mi,tree[i<<1|1].mi); } void build(int l,int r,int i) { tree[i].l=l; tree[i].r=r; if(tree[i].l==tree[i].r){ tree[i].ma=tree[i].mi=a[l]; return; } int mid=l+r>>1; build(l,mid,i<<1); build(mid+1,r,i<<1|1); pushup(i); } int query1(int l,int r,int i) { if(tree[i].l==l&&tree[i].r==r){ return tree[i].ma; } int mid=tree[i].l+tree[i].r>>1; if(r<=mid)return query1(l,r,i<<1); else if(l>mid)return query1(l,r,i<<1|1); else return max(query1(l,mid,i<<1),query1(mid+1,r,i<<1|1)); } int query2(int l,int r,int i) { if(tree[i].l==l&&tree[i].r==r){ return tree[i].mi; } int mid=tree[i].l+tree[i].r>>1; if(r<=mid)return query2(l,r,i<<1); else if(l>mid)return query2(l,r,i<<1|1); else return min(query2(l,mid,i<<1),query2(mid+1,r,i<<1|1)); } int main() { int n,i,j,k,maxi,ans,mini; while(~scanf("%d",&n)) { for(i=1;i<=n;i++) scanf("%d",&a[i]); build(1,n,1); int l,r; l=r=1; maxi=mini=a[1]; ans=1; for(i=2;i<=n;i++) { r=i; maxi=max(maxi,a[i]); mini=min(mini,a[i]); while(maxi-mini>1){ l++; maxi=query1(l,r,1); mini=query2(l,r,1); } ans=max(ans,r-l+1); } printf("%d\n",ans); } }
相关文章推荐
- Android开发艺术探索》读书笔记 (8) 第8章 理解Window和WindowManager
- 申请高德地图android SDK的Key
- 《Android开发艺术探索》读书笔记 (7) 第7章 Android动画深入分析
- Jquery $(selector,Object)
- Android Studio基础之导入&新建项目(二)-学习篇
- Android Studio 教程(干货)
- 《Android开发艺术探索》读书笔记 (6) 第6章 Android的Drawable
- Android开发艺术探索》读书笔记 (5) 第5章 理解RemoteViews
- 如何向android studio中导入第三方类库
- 如何向android studio中导入第三方类库
- 如何向android studio中导入第三方类库
- iOS 图形处理 Core Graphics Quartz2D 教程
- 《Android开发艺术探索》读书笔记 (4) 第4章 View的工作原理
- Android 瀑布流
- IOS Framework 制作教程 for xcode7 (一)
- 《Android开发艺术探索》读书笔记 (3) 第3章 View的事件体系
- android 动画效果
- 怎样在MindMapper中添加网页链接
- 《Android开发艺术探索》读书笔记 (2) 第2章 IPC机制
- ios 关于navigationController导航栏隐藏问题