HDU - 5289求助(悬赏5个关注啊啊啊
  • 板块灌水区
  • 楼主封禁用户
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/12/13 18:37
  • 上次更新2023/10/24 07:47:14
查看原帖
HDU - 5289求助(悬赏5个关注啊啊啊
649111
封禁用户楼主2022/12/13 18:37

https://vjudge.csgrandeur.cn/problem/HDU-5289

#include<bits/stdc++.h>
using namespace std;
int a,b,c,d,e,f,g,len,k;
long long anss;
int s[100005],ssss[100005][30],sssss[100005][30];
int erf(int l,int r){//二分 
	int mid;
	while(l<=r){
		mid=(l+r)/2;
		len=log2(r-l+1);
		long long ls=max(ssss[l][len],ssss[r+1-(1<<len)][len])-min(sssss[l][len],sssss[r+1-(1<<len)][len]);
		if(ls>k){
			r=mid-1;
		}
		else{
			l=mid+1;
		}
	}
	return l;
}
int main(){
	scanf("%lld",&g);
	for(int il=1;il<=g;il++){
		scanf("%lld",&a);
		scanf("%lld",&k);
		for(int i=1;i<=a;i++){
			scanf("%lld",&s[i]);
		}
		for(int j=0;(1 << j) <= a;j++){
			for(int i=1;i<=a - (1 << j) + 1;i++){
				if(j==0){
					ssss[i][0]=s[i];
					sssss[i][0]=s[i];
				}
				else{
					ssss[i][j]=max(ssss[i][j-1],ssss[i+(1 << (j - 1))][j-1]);
					sssss[i][j]=min(sssss[i][j-1],sssss[i+(1 << (j - 1))][j-1]);
				}
			}
		}	
		for(int i=1;i<=a;i++){
			anss=anss+erf(i,a)-i;
		}
		printf("%lld\n",anss);
		anss=0;
	}
	return 0;
} 
2022/12/13 18:37
加载中...