机试刷题Day2 rmq+二分

题目链接: 点击打开链接
代码:
#include
#include 
#include 
#include 
#include 
using namespace std;
const int maxn = 100005;
int a[maxn],q_max[maxn][50],q_min[maxn][50];
int n,k;

void rmq(){
    for(int j=0; (1<>1;
                if(Q(i,mid,true)-Q(i,mid,false) >= k) r = mid;
                else l = mid;
            }
            ans += (l-i+1);
        }
        printf("%lld\n",ans);
    }
    return 0;
}

wa两次,因为没用long long
复习一下rmq。dp[i][j]表示从i开始的2^j长度中的最值。由此可列出转移方程。代码里有。


稍微改了一下,这个更好一点
#include
#include 
#include 
#include 
#include 
#include 
using namespace std;
const int maxn = 100005;
int a[maxn],q_max[maxn][50],q_min[maxn][50];
int n,k;

void rmq(){
    for(int j=0; (1<>1;
                if(Q(i,mid,true)-Q(i,mid,false) >= k) r = mid;
                else l = mid;
            }
            ans += (l-i+1);
        }
        printf("%lld\n",ans);
    }
    return 0;
}

你可能感兴趣的:(数据结构)