HDU 5289 Assignment【二分+RMQ】

Assignment

题意:给一个数组,给一个K,找到满足连续子串的个数,使子串中的最小值与最大值之差小于K,  N:1e5

思路:确定右端点,二分枚举右端点,找到最大的满足位置,用RMQ判断,统计每一左端点的贡献即可;


AC代码:

#include
#include
#include

using namespace std;
typedef long long LL;

const int MAXN=1e5+11;
int a[MAXN],dmin[MAXN][33],dmax[MAXN][33],prelog2[MAXN+11];

void RMQ_init(int N) {
	for(int i=0;i>1;
				if(Judge(i,mid,K)) {
				//	if(pos==mid) break; 
					pos=mid;
					L=mid+1;
				}
				else R=mid;
			}
		//	printf("pppp %d\n",pos);
			LL len=pos-i+1;
			ans=ans+len;
			++i;
		} 
		printf("%lld\n",ans);
	}
	return 0;
} 


你可能感兴趣的:(8-二分,RMQ)