#include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> using namespace std; const int N = 1e5+20, M = 30005, mod = 1000000007, inf = 0x3f3f3f3f; typedef long long ll; //不同为1,相同为0 int dp[N][22],f[N][22],a[N],n,T,k; void RMQ() { for(int i = 1; i <= n; i++) dp[i][0] = f[i][0] = a[i]; for(int i = 1; (1<<i) <= n; i++) { for(int j = 1; (j + (1<<i) - 1) <= n; j++) { dp[j][i] = max(dp[j][i-1],dp[j + (1<<(i-1))][i-1]); f[j][i] = min(f[j][i-1],f[j + (1<<(i-1))][i-1]); } } } int query(int l,int r,int p) { if(l == r) return a[l]; int k = (int) ((log((double)(r - l + 1))) / log(2.0)); if(p) return max(dp[l][k] , dp[r - (1<<k) + 1][k]); else return min(f[l][k] , f[r - (1<<k) + 1][k]); } int main() { scanf("%d",&T); while(T--) { scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) scanf("%d",&a[i]); RMQ(); ll ans = 0 ; for(int l=1;l<=n;l++) { int L = l, R = n,A=l; while(L<=R) { int mid = (L+R)>>1; if(query(l,mid,1)-query(l,mid,0)<k) L = mid+1,A=mid; else R = mid-1; } ll sum = A-l+1; ans+=(sum); } printf("%I64d\n",ans); } return 0; }
原文:http://www.cnblogs.com/zxhl/p/5271687.html