题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5288
主要是自己太菜
当时也是一个小时才过
开始还犹豫时间复杂度能不能过
后来看时间还可以
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <cassert>
#include <cctype>
#include <climits>
#include <algorithm>
#include <set>
#include <vector>
#include <stack>
#include <queue>
#include <string>
#define maxinf 0x7fffffff
#define max(a,b) a>b?a:b
#define min(a,b) a<b?a:b
using namespace std;
typedef long long LL;
long long ss[100006];
struct tt{
long long mi,ma;
int num;
} f[100006];
int main(){
int T;
int n,k;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%lld",&ss[i]) ;
}
if(k==0) {cout<<n<<endl;continue;}
f[1].num=1;
f[1].ma=ss[1];f[1].mi=ss[1];
long long ans=f[1].num;
for(int i=2;i<=n;i++){
if(ss[i]>=f[i-1].mi&&ss[i]<=f[i-1].ma){
f[i].num=f[i-1].num+1;
f[i].mi=f[i-1].mi;
f[i].ma=f[i-1].ma;
}
else if(ss[i]>f[i-1].ma&&ss[i]-f[i-1].mi<k){
f[i].num=f[i-1].num+1;
f[i].mi=f[i-1].mi;
f[i].ma=ss[i];
}
else if(ss[i]<f[i-1].mi&&f[i-1].ma-ss[i]<k){
f[i].num=f[i-1].num+1;
f[i].ma=f[i-1].ma;
f[i].mi=ss[i];
}
else {
int j;
int maxx=ss[i],minn=ss[i];
for(j=i-1;j>=0;j--){
f[i].ma=maxx;f[i].mi=minn;
minn=min(minn,ss[j]);
maxx=max(maxx,ss[j]);
if(maxx-minn>=k) break;
}
f[i].num=i-j;
}
ans+=f[i].num;
}
printf("%lld\n",ans);
}
}
/*
(1<=n<=100000, 0<=k<=10^9),
Sample Input
2
4 2
3 1 2 4
10 5
0 3 4 5 2 1 6 7 8 9
Sample Output
5
28
*/
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5288