【再见RMQ】NYOJ-119-士兵杀敌(三),区间内大小差值
2015-05-06 23:30
381 查看
【题目链接:NYOJ-119】
思路:转自 点我 ,讲的挺好。
思路:转自 点我 ,讲的挺好。
#include <cstdio> #include <math.h> #define max(a,b) ((a>b)?a:b) #define min(a,b) (a<b?a:b) const int maxn=100010; int h[maxn]; int mx[maxn][20],mn[maxn][20]; int n,q; void rmq_init(){ int i,j,t; for(j=1;j<=n;j++) mx[j][0]=mn[j][0]=h[j]; int m=floor(log((double)n)/log(2.0)); for(i=1;i<=m;i++){ for(j=1;j<=n;j++){ t = j+(1<<(i-1)); if(t<=n) mx[j][i]=max(mx[j][i-1],mx[t][i-1]); else mx[j][i]=mx[j][i-1]; } } for(i=1;i<=m;i++){ for(j=1;j<=n;j++){ t = j+(1<<(i-1)); if(t<=n) mn[j][i]=min(mn[j][i-1],mn[t][i-1]); else mn[j][i]=mn[j][i-1]; } } } int rmq(int l,int r){ int m=floor(log((double)(r-l+1))/log(2.0)); int a=max(mx[l][m],mx[r-(1<<m)+1][m]); int b=min(mn[l][m],mn[r-(1<<m)+1][m]); return a-b; } int main(){ int i,l,r; int T,C,L,R; scanf("%d%d",&n,&q); for(i = 1;i <= n;i++) scanf("%d",&h[i]); rmq_init(); while(q--){ scanf("%d%d",&L,&R); printf("%d\n",rmq(L,R)); } return 0; }
相关文章推荐
- nyoj 士兵杀敌(三) 119 (区间dp+RMQ&&线段树) 好题
- NYOJ-119-士兵杀敌(三)(RMQ)
- NYOJ 题目119 士兵杀敌(三)(线段树,区间最值)
- nyoj 119 士兵杀敌(三)(RMQ)
- nyoj 119士兵杀敌(三)(线段树区间最值查询,RMQ算法)
- nyoj 119: 士兵杀敌(三) 【RMQ模板】
- nyoj 119 士兵杀敌(三)(RMQ)
- nyoj119 士兵杀敌三(区间最值)
- nyoj 119 士兵杀敌(三)(RMQ)
- NYOJ119 士兵杀敌(三)(RMQ算法)
- NYOJ119士兵杀敌(三)RMQ问题之ST…
- nyoj 119 士兵杀敌(三) 【RMQ】&&【DP】
- NYOJ-士兵杀敌(三) 线段树RMQ算法求区间的最大差值
- nyoj 119 士兵杀敌(三)(RMQ)
- nyoj 119 士兵杀敌(三) <模板RMQ--静态数组时求最大最小值>
- NYOJ 119 士兵杀敌(三)(RMQ算法)
- nyoj 119 士兵杀敌(三)(RMQ)
- nyoj--119 士兵杀敌(三)(RMQ)
- NYOJ-119 士兵杀敌(三)【RMQ算法】
- NYOJ 119士兵杀敌(三)(RMQ问题)(ST表)