月赛1A求hack
查看原帖
月赛1A求hack
479532
InterN_NOT_FOUND楼主2023/3/12 18:16

rt,1A 90pts,样例和手造样例全过

//前面太长影响观感就截掉了
//思路:枚举每一个区间,第一次出现不符合要求的数数时进行修改,第二次出现更新答案并回到第一次的位置,正反跑两遍(过例4)

const int N = 1e6 + 10;

int n = read(), a[N], ans;

signed main()
{
	for (int i = 1; i <= n; ++i) a[i] = read();
	
	int l = 1, r = 1, Z46, H2016 = a[1], Z52 = 1;
	bool Z47 = 0;
	//Z46:第一次出现不符合要求数的位置
    //Z47:是否出现过不符合要求的数
    //H2016:这个位置的数应修改为什么
    //Z52:目前区间长度
    
	while (l < n && r < n) {
		if (a[r + 1] > H2016) r ++, H2016 = a[r], Z52 ++;//符合要求
		if (a[r + 1] <= H2016 && !Z47) {
			Z47 = 1; Z46 = r + 1; H2016 = a[r] + 1;
			r ++;
			Z52 ++;//第一次出现不符合要求的数,将这个数改为前一个数+1
		} 
		if (a[r + 1] <= H2016 && Z47) {
			Z47 = 0;
			l = r = Z46;
			ans = max(ans, Z52);
			Z52 = 1;
			H2016 = a[r];//第二次出现,回到第一次位置,更新答案
		}
	}
	
	ans = max(ans, Z52);
	
	l = n, r = n, H2016 = a[n], Z52 = 1;
	Z47 = 0;
	
	while (l > 1 && r > 1) {
		if (a[r - 1] < H2016) r --, H2016 = a[r], Z52 ++;
		if (a[r - 1] >= H2016 && !Z47) {
			Z47 = 1; Z46 = r - 1; H2016 = a[r] - 1;
			r --;
			Z52 ++;//将这个数修改为后一个数-1
		} 
		if (a[r - 1] >= H2016 && Z47) {
			Z47 = 0;
			l = r = Z46;
			ans = max(ans, Z52);
			Z52 = 1;
			H2016 = a[r];
		}
	}
	
	ans = max(ans, Z52);
	
	out(ans, 'l');
	return 0;
}

2023/3/12 18:16
加载中...