Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

崩了,无限RE,哪位大佬帮我看看

Posted by tanruidd at 2017-07-28 22:03:18 on Problem 3368
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int MaxN = 2e5;
const int INF = 1e6;
int n, q, a, b, t;
int num[MaxN], pos[MaxN];
struct NOOD{
	int l, r, cnt;
}ans[200010];
int f[MaxN + 10][50];
void Init() {
	memset(ans, 0, sizeof(ans));
	memset(f, 0, sizeof(f));
}
void RMQ() {
	for(int j = 1; 1 << j <= t; j++)
		for(int i = 1; i + (1 << j) - 1 <= t; i++){
			f[i][j] = max(f[i][j - 1], f[i + 1 << (j - 1)][j - 1]);
		}
}
int sum(int l, int r) {
	if(l > r)return 0;
	int k = log(double(r - l + 1)) / log(2.0);
	return max(f[l][k], f[r - (1 << k) + 1][k]);
}
int main() {
	while(~scanf("%d%d", &n, &q) && n) {
		int p = 1;
		t = 1;
		Init();
		pos[1] = 1;
		for(int i = 1; i <= n; i++)scanf("%d", &num[i]);
		for(int i = 2; i <= n + 1; i++) {
			if(num[i] != num[i - 1]){
				ans[t].l = p;
				ans[t].r = i - 1;
				ans[t].cnt = i - p;
				f[t][0] = ans[t].cnt;
				p = i;
				t++;
			}
			pos[i] = t;
		}
		t--;
		RMQ();
		for(int i = 1; i <= q; i++) {
			scanf("%d%d", &a, &b);
			if(pos[a] == pos[b])printf("%d\n", b - a + 1);
			else if(pos[b] - pos[a] == 1)
				printf("%d\n", max(ans[pos[a]].r - a + 1, b - ans[pos[b]].l + 1));
			else {
				int ant = max(ans[pos[a]].r - a + 1, b - ans[pos[b]].l + 1);
				ant = max(ant, sum(pos[a] + 1, pos[b] - 1));
				printf("%d\n", ant);
			}
		}
	}
	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator