⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 poj3368_rmq.cpp

📁 本人最近在acm.pku.edu.cn上通过的程序
💻 CPP
字号:
#include <algorithm>
using namespace std;

const int MAXN = 100000;
int n, m;
int be[MAXN], ed[MAXN], num[MAXN];

bool init(){
	int nn;
	scanf("%d", &nn);
	if (nn == 0) return false;
	int a, b = -0x3fffffff;
	n = 0; scanf("%d", &m);
	memset(num, 0, sizeof(num));
	memset(ed, 0, sizeof(ed)); 
	memset(be, 0, sizeof(be));
	scanf("%d", &b); 
	int j = 1; ed[0] = 1;
	for (int i = 2; i <= nn; i++) {
		scanf("%d", &a);
		if (a != b){
			be[n] = j;
			num[n] = i - j;
			ed[n++] = i - 1;
			j = i; b = a;
		}
	}
	be[n] = j;
	ed[n] = nn;
	num[n++] = nn  + 1 - j;
	be[n] = nn + 1;
	return true;
}


int h[MAXN][32];
void prepare(){
	int i, j, l;
	for (i = 0; i < n; i++) h[i][0] = num[i];
	for (j = 1, l = 1; l * 2 <= n; j++, l*= 2) for (i = 0; i <= n - l * 2; i++)
		h[i][j] = (h[i][j-1] > h[i+l][j-1]) ? h[i][j-1] : h[i+l][j-1];	
}

int query(int be, int ed){
	int j = 0, l = 1; 
	while (2 * l <= ed - be + 1) j++, l *= 2;
	return (h[be][j] > h[ed + 1 - l][j]) ? h[be][j] : h[ed + 1 - l][j];	
} 

int find(int x){
	int low = 0, high = n + 1, mid;
	while (low + 1 < high){
		mid = (low + high) / 2;
		if (x < be[mid]) high = mid; else low = mid;
	}
	return low;
}

void solve(){
	prepare();
	int a, b, ia, ib;
	for (int i = 0; i < m; i++){
		scanf("%d %d", &a, &b);
		ia = find(a); 
		ib = find(b);
		//printf("%d %d\n", ia, ib);
		if (ia == ib){
			printf("%d\n", b - a + 1);
			continue;
		}
		int tmp1 = be[ia + 1] - a;
		int tmp2 = b - be[ib] + 1; 
		//printf("  %d %d\n", tmp1, tmp2);
		if (ia + 1 == ib){
			printf("%d\n", tmp1 >?= tmp2);
			continue;
		}
		int ans = query(ia + 1, ib - 1);
		ans >?= tmp1;
		ans >?= tmp2;
		printf("%d\n", ans);
	}
}	

int main(){
	//freopen("test.in", "r", stdin);
	//freopen("test.out", "w", stdout);
	while (init()) solve();
	return 0;	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -