POJ 3264 Balanced Lineup (线段树)
2017-07-29 14:08
483 查看
区间查询最大与最小值,并求其差,两个query分别找最大最小求差就行了。。。4000+ms险过
#include<cstdio> #include<iostream> #include<cmath> #include<algorithm> #include<cstring> using namespace std; #define MAXN 50500 struct segTree { int minn,maxn; int l,r; }tree[MAXN<<3]; void build(int root,int ibegin,int iend) { tree[root].l=ibegin; tree[root].maxn=0; tree[root].minn=100000000; tree[root].r=iend; if(ibegin==iend) return; int mid=(ibegin+iend)/2; build(root*2+1,ibegin,mid); build(root*2+2,mid+1,iend); } void update(int root,int laz, int x) { if(laz<tree[root].l||laz>tree[root].r) return ; if(tree[root].l==tree[root].r) { tree[root].maxn=max(tree[root].maxn,x); tree[root].minn=min(tree[root].minn,x); return; } int mid=(tree[root].l+tree[root].r)/2; if(laz<=mid) update(root*2+1,laz,x); else update(root*2+2,laz,x); tree[root].maxn=max(tree[root*2+1].maxn,tree[root*2+2].maxn); tree[root].minn=min(tree[root*2+1].minn,tree[root*2+2].minn); } int queryminn(int root,int ibegin,int iend) { if(iend<tree[root].l||ibegin>tree[root].r) return -1; if(tree[root].l==ibegin&&tree[root].r==iend) return tree[root].minn; int mid=(tree[root*2+1].l+tree[root*2+2].r)/2; if(mid<ibegin) return queryminn(root*2+2,ibegin,iend); else if(iend<=mid) return queryminn(root*2+1,ibegin,iend); else return min(queryminn(root*2+1,ibegin,mid), queryminn(root*2+2,mid+1,iend)); } int querymaxn(int root,int ibegin,int iend) { if(iend<tree[root].l||ibegin>tree[root].r) return -1; if(tree[root].l==ibegin&&tree[root].r==iend) return tree[root].maxn; int mid=(tree[root*2+1].l+tree[root*2+2].r)/2; if(mid<ibegin) return querymaxn(root*2+2,ibegin,iend); else if(iend<=mid) return querymaxn(root*2+1,ibegin,iend); else return max(querymaxn(root*2+1,ibegin,mid), querymaxn(root*2+2,mid+1,iend)); } int main() { int n,q;int a; while(cin>>n>>q) { build(0,1,n); for(int i=1;i<=n;i++) { scanf("%d",&a); update(0,i,a); } int l,r; for(int i=1;i<=q;i++) { scanf("%d%d",&l,&r); cout<<querymaxn(0,l,r)-queryminn(0,l,r)<<endl; } } }
相关文章推荐
- POJ - 3264 Balanced Lineup 线段树解RMQ
- 【POJ 3264】Balanced Lineup(RMQ算法||线段树)
- [POJ 3264] Balanced Lineup [线段树]
- poj 3264 Balanced Lineup(线段树)
- poj 3264 Balanced Lineup(基础线段树)
- POJ 3264 Balanced Lineup (线段树||RMQ)
- poj 3264 Balanced Lineup(线段树无区)
- poj 3264 Balanced Lineup(RMQ线段树)
- POJ 3264-Balanced Lineup(线段树:单点更新,区间查询)
- poj 3264 Balanced Lineup 线段树
- poj 3264 Balanced Lineup (线段树模板题)
- Balanced Lineup(POJ 3264)(数据结构之线段树)
- Balanced Lineup (POJ_3264) 线段树+区间查询
- poj 3264 Balanced Lineup(线段树)
- poj_3264_Balanced Lineup(线段树)
- POJ 3264 Balanced Lineup【线段树区间查询求最大值和最小值】
- poj-3264-Balanced Lineup-线段树-区域查询
- POJ 3264-Balanced Lineup详解(线段树区间求值)
- 【线段树 + 详细注释】北大 poj 3264 Balanced Lineup
- poj 3264 Balanced Lineup(基础线段树)