poj3264线段数求最大最小值
2017-03-03 16:28
375 查看
链接:https://vjudge.net/contest/66989#problem/G
完完全全的水题,还是被坑了,一个return忘了写,de了半天bug!!
完完全全的水题,还是被坑了,一个return忘了写,de了半天bug!!
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define ll long long #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 const int maxn=50010; const ll inf=1e15; ll value1[maxn<<2],value2[maxn<<2]; void pushup(int rt) { value1[rt]=max(value1[rt<<1],value1[rt<<1|1]); value2[rt]=min(value2[rt<<1],value2[rt<<1|1]); } void btree(int l,int r,int rt) { if(l==r) { scanf("%lld",&value1[rt]); value2[rt]=value1[rt]; return ; } int m=(l+r)>>1; btree(ls); btree(rs); pushup(rt); } ll query1(int L,int R,int l,int r,int rt) { if(L<=l&&r<=R)return value1[rt]; int m=(l+r)>>1; ll ans=0; if(L<=m)ans=max(ans,query1(L,R,ls)); if(R>m)ans=max(ans,query1(L,R,rs)); return ans; } ll query2(int L,int R,int l,int r,int rt) { if(L<=l&&r<=R)return value2[rt]; int m=(l+r)>>1; ll ans=inf; if(L<=m)ans=min(ans,query2(L,R,ls)); if(R>m)ans=min(ans,query2(L,R,rs)); return ans; } int main() { int n,m; while(~scanf("%d%d",&n,&m)){ btree(1,n,1); while(m--){ int l,r; scanf("%d%d",&l,&r); printf("%lld\n",query1(l,r,1,n,1)-query2(l,r,1,n,1)); } } }
相关文章推荐
- zoj 3386 Trick or Treat 求x轴上一点到各点的最大值中的最小值 点到线段距离 三分
- poj3264(线段树求区间最大最小值)
- POJ3264(线段树求区间最大最小值)
- POJ3264 区间最大最小值
- poj3264 线段树维护最大值最小值
- poj 3264 Balanced Lineup(线段数求区间最大最小值)
- 求最大最小值(转)
- 如何求当前编译环境下内置类型的最大值和最小值
- 有关32位机整型和无符号整型取值的最大值最小值问题
- C/C++中各种类型int、long、double、char表示范围(最大最小值)
- Xcode-C语言出接触_关于求最大值最小值的位置问题
- C/C++标准库中定义的各个类型最大值最小值limit.h
- 分治求数组的最大最小值
- ST算法详解+例题 O(1)查询区间最大最小值
- 区间最大值最小值区间和查询
- 求最大值最小值
- HDU4302 - Holedox Eating(单点修改&&最大值最小值查询)
- POJ 3264 Balanced Lineup 区间查询(两棵树求最大最小值)
- 小试身手python 输出最大值与最小值
- 二维线段树区域修改,最大值最小值