标签:return ott string ack time 0ms auth track ons
2 4 2 3 1 2 4 10 5 0 3 4 5 2 1 6 7 8 9
5 28HintFirst Sample, the satisfied groups include:[1,1]、[2,2]、[3,3]、[4,4] 、[2,3]
#include<stdio.h>
#include<string.h>
#include<math.h>
#define max(a,b) (a>b?a:b)
#define min(a,b) (a>b?b:a)
int n;
__int64 m;
__int64 a[100010];
__int64 maxv[100010][20],minv[100010][20];
void init()
{
int i,j,k;
for(i=1;i<=n;i++)
{
minv[i][0]=a[i];
maxv[i][0]=a[i];
}
for(j=1;(1<<j)<=n;j++)
{
for(k=0;k+(1<<j)-1<=n;k++)
{
minv[k][j]=min(minv[k][j-1],minv[k+(1<<(j-1))][j-1]);
maxv[k][j]=max(maxv[k][j-1],maxv[k+(1<<(j-1))][j-1]);
}
}
}
__int64 q_max(int l,int r)
{
int k=(int)(log((double)(r-l+1))/log(2.0));
return max(maxv[l][k],maxv[r-(1<<k)+1][k]);
}
__int64 q_min(int l,int r)
{
int k=(int)(log((double)(r-l+1))/log(2.0));
return min(minv[l][k],minv[r-(1<<k)+1][k]);
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%I64d",&n,&m);
int i,j,k;
for(i=1;i<=n;i++)
{
scanf("%I64d",&a[i]);
}
init();
__int64 ans=0;
int p=1;
/*for(i=1;i<=n;i++)//暴力超时
{
for(j=i;j<=n;j++)
{
if(q_max(i,j)-q_min(i,j)<m)
ans++;
}
}*/
for(i=1;i<=n;i++)
{
while(q_max(p,i)-q_min(p,i)>=m&&p<i)
{
p++;
}
ans+=i-p+1;
}
printf("%I64d\n",ans);
}
}#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std ;
#define LL __int64
deque <LL> deq1 , deq2 ;
//单调队列,deq1最大值,deq2最小值
LL a[100010] ;
int main() {
int t , n , i , j ;
LL k , ans ;
scanf("%d", &t) ;
while( t-- ) {
scanf("%d %I64d", &n, &k) ;
for(i = 0 ; i < n ; i++)
scanf("%I64d", &a[i]) ;
if(k == 0) {
printf("0\n") ;
continue ;
}
while( !deq1.empty() ) deq1.pop_back() ;
while( !deq2.empty() ) deq2.pop_back() ;
for(i = 0 , j = 0 , ans = 0; i < n ; i++) {//i在前。j在后
while( !deq1.empty() && deq1.back() < a[i] ) deq1.pop_back() ;
deq1.push_back(a[i]) ;
while( !deq2.empty() && deq2.back() > a[i] ) deq2.pop_back() ;
deq2.push_back(a[i]) ;
while( !deq1.empty() && !deq2.empty() && deq1.front() - deq2.front() >= k ) {
ans += (i-j) ;
//printf("%d %d,%I64d %I64d\n", i , j, deq1.front() , deq2.front() ) ;
if( deq1.front() == a[j] ) deq1.pop_front() ;
if( deq2.front() == a[j] ) deq2.pop_front() ;
j++ ;
}
}
while( j < n ) {
ans += (i-j) ;
j++ ;
}
printf("%I64d\n", ans) ;
}
return 0 ;
}HDOJ 题目5289 Assignment(RMQ,技巧)
标签:return ott string ack time 0ms auth track ons
原文地址:http://www.cnblogs.com/tlnshuju/p/7017677.html