poj 3264 Balanced Lineup ST
2016-07-05 09:16
344 查看
传送门
题目大意:
给出n个数,q个询问,求出每个区间中max-min的值
分析:
ST裸题 ……(⊙o⊙) >_<
代码如下:
题目大意:
给出n个数,q个询问,求出每个区间中max-min的值
分析:
ST裸题 ……(⊙o⊙) >_<
代码如下:
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #define inf 0x3f3f3f3f using namespace std; const int maxn=50005; int n,m,a[maxn],fmax[maxn][25],fmin[maxn][25]; void ST(){ for(int j=1;j<=20;j++) for(int i=1;i+(1<<(j-1))<=n;i++) fmax[i][j]=max(fmax[i][j-1],fmax[i+(1<<(j-1))][j-1]); for(int j=1;j<=20;j++) for(int i=1;i+(1<<(j-1))<=n;i++) fmin[i][j]=min(fmin[i][j-1],fmin[i+(1<<(j-1))][j-1]); } int askmax(int x,int y){ int len=y-x+1; int k; for(k=20;k>=0;k--) if(len&(1<<k)||k==0) break; return max(fmax[x][k],fmax[y-(1<<k)+1][k]); } int askmin(int x,int y){ int len=y-x+1; int k; for(k=20;k>=0;k--) if(len&(1<<k)||k==0) break; return min(fmin[x][k],fmin[y-(1<<k)+1][k]); } signed main(void){ scanf("%d%d",&n,&m); memset(fmax,-inf,sizeof(fmax)); memset(fmin,inf,sizeof(fmin)); for(int i=1;i<=n;i++) scanf("%d",&a[i]),fmax[i][0]=fmin[i][0]=a[i]; ST(); while(m--){ int x,y; scanf("%d%d",&x,&y); printf("%d\n",askmax(x,y)-askmin(x,y)); } return 0; } ---------- 感谢yousiki ---------- by >o< neighthorn
相关文章推荐
- js利用正则表达式检验输入内容是否为网址
- linux 最小内核模块
- 《剑指offer》-数字在排序数组中出现的次数
- SQLSERVER 数据库时间格式获取对应表
- 移动web适配利器-rem In CSS3
- js正则表达式
- Linux:Top命令比较实用的几个操作命令总结
- 前端开发学习路线
- LAMP--Apache 日志记录代理 ip 和真实客户端 ip
- C# SQlite操作方法小结
- Best Time to Buy and Sell Stock | & || & III
- tcpdump
- OC面向对象—封装
- jni object的使用
- freemark模板引擎的使用
- 第12期 【鸟随鸾凤飞腾远】 7月刊
- 五分钟轻松搞定产品需求文档!这可能史上最全PRD文档模板
- socket选项自带的TCP异常断开检测
- XZ_iOS之collectionView的header和footer的重用
- 域名被墙的3种状态