POJ 2823 线段树 暴力之...
2013-10-01 15:44
190 查看
#include "stdio.h" #include "string.h" #include "math.h" #include "stdlib.h" int ans1[1000010],ans2[1000010]; struct comp { int l,r,mid; int max,min; } data[3000010]; int max,min; int maxx(int a,int b) { if (a<b) return b; else return a; } int minx(int a,int b) { if (a<b) return a; else return b; } void build(int l,int r,int k) { data[k].l=l; data[k].r=r; data[k].mid=(l+r)/2; if (l==r) { scanf("%d",&data[k].max); data[k].min=data[k].max; return ; } build(l,data[k].mid,k*2); build(data[k].mid+1,r,k*2+1); data[k].max=maxx(data[k*2].max,data[k*2+1].max); data[k].min=minx(data[k*2].min,data[k*2+1].min); } void query(int l,int r,int k) { if (l==data[k].l && data[k].r==r) { if (data[k].max>max) max=data[k].max; if (data[k].min<min) min=data[k].min; return ; } if (r<=data[k].mid) query(l,r,k*2); else if (l>data[k].mid) query(l,r,k*2+1); else { query(l,data[k].mid,k*2); query(data[k].mid+1,r,k*2+1); } } int main() { int n,m,i; while (scanf("%d%d",&n,&m)!=EOF) { build(1,n,1); for (i=1;i<=n-m+1;i++) { max=-0x7fffffff; min=0x7fffffff; query(i,i+m-1,1); ans1[i]=min; ans2[i]=max; } for (i=1;i<n-m+1;i++) printf("%d ",ans1[i]); printf("%d\n",ans1[n-m+1]); for (i=1;i<n-m+1;i++) printf("%d ",ans2[i]); printf("%d\n",ans2[n-m+1]); } return 0; }
相关文章推荐
- poj 2823 poj 3264 线段树维护最大最小值
- POJ 2823 Sliding Window 线段树
- POJ 2823 Sliding Window(线段树入门)
- poj 2823 线段树
- POJ 2823 线段树 Or 单调队列
- POJ 2823 线段树简单操作
- 单调队列 | 线段树 | 一维RMQ —— POJ 2823
- POJ 3264 线段树 暴力之...
- POJ 2823 线段树 Or 单调队列
- poj 2823 Sliding Window (线段树 求固定区间的最大最小值 )
- poj 2823 Sliding Window (单调队列 or 线段树)
- Sliding Window POJ - 2823 线段树区间更新
- poj 2823 Sliding Window(线段树)
- POJ 2823 Sliding Window 线段树
- POJ 2823 Sliding Window (线段树/单调队列)
- POJ 2823 Sliding Window 线段树
- POJ 1436——Horizontally Visible Segments(线段树,区间染色+暴力+简单hash)
- POJ 2823 Sliding Window【线段树+单调队列】
- POJ 2823 线段树区间查询
- poj_2823 线段树