POJ 3264
2015-07-13 23:26
471 查看
线段树,求区间上的最大值和最小值之差。水题,套模板即可。
不会起变量名是硬伤,呜呜呜~~~
AC代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define maxx 50005
int max0[maxx<<2],min0[maxx<<2];
void find_m(int rt)
{
max0[rt]=max(max0[rt<<1],max0[rt<<1|1]);
min0[rt]=min(min0[rt<<1],min0[rt<<1|1]);
//cout<<max0[rt]<<" "<<min0[rt]<<endl;
}
void build(int l,int r,int rt)
{
if(l==r)
{
scanf("%d",&max0[rt]);
min0[rt]=max0[rt];
return;
}
int m=(l+r)>>1;
build(lson);
build(rson);
find_m(rt);
}
int query1(int left,int right,int l,int r,int rt)
{
if(left<=l&&right>=r)
return max0[rt];
int ans=0;
int m=(l+r)>>1;
if(left<=m)
ans=max(ans,query1(left,right,lson));
if(right>m)
ans=max(ans,query1(left,right,rson));
return ans;
}
int query2(int left,int right,int l,int r,int rt)
{
if(left<=l&&right>=r)
return min0[rt];
int ans=999999999;
int m=(l+r)>>1;
if(left<=m)
ans=min(ans,query2(left,right,lson));
if(right>m)
ans=min(ans,query2(left,right,rson));
return ans;
}
int main()
{
int n,q;
int a,b;
while(scanf("%d%d",&n,&q)!=EOF)
{
build(1,n,1);
while(q--)
{
scanf("%d%d",&a,&b);
printf("%d\n",query1(a,b,1,n,1)-query2(a,b,1,n,1));
}
}
return 0;
}
不会起变量名是硬伤,呜呜呜~~~
AC代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define maxx 50005
int max0[maxx<<2],min0[maxx<<2];
void find_m(int rt)
{
max0[rt]=max(max0[rt<<1],max0[rt<<1|1]);
min0[rt]=min(min0[rt<<1],min0[rt<<1|1]);
//cout<<max0[rt]<<" "<<min0[rt]<<endl;
}
void build(int l,int r,int rt)
{
if(l==r)
{
scanf("%d",&max0[rt]);
min0[rt]=max0[rt];
return;
}
int m=(l+r)>>1;
build(lson);
build(rson);
find_m(rt);
}
int query1(int left,int right,int l,int r,int rt)
{
if(left<=l&&right>=r)
return max0[rt];
int ans=0;
int m=(l+r)>>1;
if(left<=m)
ans=max(ans,query1(left,right,lson));
if(right>m)
ans=max(ans,query1(left,right,rson));
return ans;
}
int query2(int left,int right,int l,int r,int rt)
{
if(left<=l&&right>=r)
return min0[rt];
int ans=999999999;
int m=(l+r)>>1;
if(left<=m)
ans=min(ans,query2(left,right,lson));
if(right>m)
ans=min(ans,query2(left,right,rson));
return ans;
}
int main()
{
int n,q;
int a,b;
while(scanf("%d%d",&n,&q)!=EOF)
{
build(1,n,1);
while(q--)
{
scanf("%d%d",&a,&b);
printf("%d\n",query1(a,b,1,n,1)-query2(a,b,1,n,1));
}
}
return 0;
}
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- C++ Custom Control控件向父窗体发送对应的消息
- C++中拷贝构造函数的应用详解