NOJ [1358] An Easy Problem
来源:互联网 发布:unity3d特效包下载 编辑:程序博客网 时间:2024/06/06 07:01
- 问题描述
- Here a simple problem.Give you n numbers.a1,a2...an.Then ask you m times.each time you should answer the the minimum number between ax to ay.
- 输入
- There are several test
First line input two number n,m(1<=n<=100000,1<=m<=100000)
then next line follow n integer.
next m line with two numbers x,y;(1<=x<=y<=n) - 输出
- for each x,y you should output the minimum number between ax to ay.rmq的裸题啊,不会rmq的话,我简单介绍下,我们用一个数组先把值存好,再开一个DP[i][j]来表示区间[i,i+2^j-1]的最值,把区间对分为2块,最值就是左右两块的最值的最值
#include<stdio.h>#include<math.h>int min (int a,int b){ return a<b?a:b;}int num[100010];int dp[100010][18];int temp;int n;void st(){ int i,j; int k= log((double)(n+1))/log(2.0); for(i=1;i<=n;i++) dp[i][0]=num[i]; for(j=1;j<=k;j++) for(i=1;i+(1 << j)-1 <= n;i++) dp[i][j]=min(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);}int rmq(int a,int b){ int k = (int)(log((double)(b-a+1))/log(2.0)); return min(dp[a][k],dp[b-(1<<k)+1][k]);}int main(){ int m; while(~scanf("%d%d",&n,&m)) { int i; for(i=1;i<=n;i++) scanf("%d",&num[i]); st(); int start,end; for(i=1;i<=m;i++) { scanf("%d%d",&start,&end); printf("%d\n", rmq(start,end)); } } return 0;}
0 0
- NOJ [1358] An Easy Problem
- An Easy Problem
- 2055 An easy problem
- An Easy Problem!
- An Easy Problem!
- poj2826 An Easy Problem?!
- HDOJ2055 An easy problem
- An Easy Problem
- hdu-An Easy Problem
- hdu2601 An easy problem
- An Easy Problem
- hdu-An Easy Problem
- HDU_2055 An easy problem
- HDU_2123 An easy problem
- B - An easy problem
- B - An easy problem
- An easy problem
- An easy problem 2132
- zoj1392
- 关于c语言内存地址对齐的一点思考
- C++虚析构函数
- PHP命名空间(Namespace)的使用详解
- 有关图像分割算法的几个网站
- NOJ [1358] An Easy Problem
- hdu 2807 The Shortest Path(矩阵相乘+floyd)
- 关于c语言等于运算符的一点思考
- vs2012编译xapian问题2 ------U1077,返回代码0x2
- 完全背包 nyoj 311
- 自动创建设备文件
- QQ中抖动窗口的vc++实现方法
- 关于malloc使用经历
- Algorithm学习笔记 --- Just a Hook