poj 3264 线段树方法
2013-07-30 23:08
267 查看
传送门
题意:n个数字,q个询问,问第A个到第B个数的极差。
思路:线段树,每个节点记录节点包括范围的最大值和最小值。
题意:n个数字,q个询问,问第A个到第B个数的极差。
思路:线段树,每个节点记录节点包括范围的最大值和最小值。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; struct node { int l,r; int ma,mi; }t[50005*4]; int n,q,a[50005],s,e; int mma,mmi; void create(int ll,int rr,int rot) { t[rot].l=ll; t[rot].r=rr; if(ll==rr) { t[rot].ma=a[ll]; t[rot].mi=a[ll]; } else { int mid=(ll+rr)/2; create(ll,mid,rot<<1); create(mid+1,rr,rot<<1|1); t[rot].ma=max(t[rot<<1].ma,t[rot<<1|1].ma); t[rot].mi=min(t[rot<<1].mi,t[rot<<1|1].mi); } } void query(int ll,int rr,int rot) { if(t[rot].l==ll&&t[rot].r==rr) { mma=max(mma,t[rot].ma); mmi=min(mmi,t[rot].mi); } else { int mid=(t[rot].l+t[rot].r)/2; if(rr<=mid) { query(ll,rr,rot<<1); } else if(ll>mid) { query(ll,rr,rot<<1|1); } else { query(ll,mid,rot<<1); query(mid+1,rr,rot<<1|1); } } } int main() { scanf("%d%d",&n,&q); for(int i=1;i<=n;i++)scanf("%d",&a[i]); create(1,n,1); for(int i=0;i<q;i++) { scanf("%d%d",&s,&e); mma=0; mmi=1000001; query(s,e,1); cout<<mma-mmi<<endl; } return 0; }
相关文章推荐
- poj 3264 Balanced Lineup(基础线段树)
- POJ 3264-Balanced Lineup(线段树:单点更新,区间查询)
- POJ 3264 Balanced Lineup 【线段树】
- poj 3264 Balanced Lineup(线段树)
- POJ3264 Balanced Lineup(线段树应用)
- [POJ] 3264 Balanced Lineup [线段树]
- POJ 3264 线段树模板题
- poj3264 Balanced Lineup——线段树
- POJ 3264 Balanced Lineup(RMQ 线段树)
- POJ3264[线段树]
- POJ3264——Balanced Lineup(线段树)
- poj 3264 Balanced Lineup(基础线段树)
- poj 3264 Balanced Lineup——简单线段树
- POJ 3264 Balanced Lineup 线段树入门(点的查找)
- poj 2823 poj 3264 线段树维护最大最小值
- Poj3264 Balanced Lineup 线段树基础题
- POJ 3264 Balanced Lineup (线段树基础)
- POJ 3264 Balanced Lineup (线段树)
- 线段树求逆序数方法 HDU1394&&POJ2299
- POJ 3264 Balanced Lineup【线段树区间查询求最大值和最小值】