JROI-6 普及组模拟赛

虽然不打普及组了,但事实证明普及组模拟赛不见得简单(这次还好)。

T1

题面传送门

一个经典的结论是,相邻两个数互质。因此,如果 \(\lfloor\frac l x\rfloor < \lfloor\frac r x\rfloor\),则所有数的 \(\gcd=1\),否则说明所有数相等,\(\gcd=\lfloor\frac l x\rfloor\)

T2

题面传送门

考虑贪心。

方便起见,先将 \(a_i\) 从小到大排序。然后,用 \(w\) 买到价值尽可能大的物品 \(a_m\),并令 \(w\leftarrow a_m\)

然后尝试用 \(w\) 买小价值商品,即从 \(1\) 开始枚举 \(i\),每次 \(w-a_i\),并且令商品数 \(+1\),直到 \(w<a_i\) 为止。

T3

题面传送门

由于 \(c_i=\{a_i, b_i\}\),显然当 \(a_i=b_i\) 的时候 \(c_i\) 唯一确定,其他情况 \(c_i\) 均有两种选择。

由于数据范围中 \(a_i,b_i\le n\),启示我们可以枚举 \(\text{mex}\)

具体地,假设当前枚举的 \(\text{mex}=v\),我们记录所有 \(a_i=b_i=v\) 的位置。这些位置是必然影响 \(\text{mex}\) 取值的,而其他 \(a_i\neq b_i\) 但其中一个为 \(v\) 的位置,令 \(c_i=a_i+b_i-v\) 即可避免影响。同时,这些位置 \(i\) 将序列划分成若干段,选择长度最大的一段作为 \(len_v=r-l+1\),答案为 \(len_v-v\)

这样有一个问题,就是选择的一段的 \(\text{mex}\) 可能 \(\le v\)。不过,如果整段中都存在 \(v'=\text{mex}<v\),其贡献至少为 \(len_v-v'>len_v-v\),而题目要求最大化这一值,因此 \(len_v-v\) 也就不会产生贡献了。

	read(n);
	rep(i, 1, n) read(a[i]);
	rep(i, 1, n) {
		read(b[i]);
		if(a[i] != b[i]) continue;
		len[a[i]] = max(len[a[i]], i - lst[a[i]] - 1);
		lst[a[i]] = i;
	}
	rep(v, 0, n) {
		len[v] = max(len[v], n - lst[v]);
		ans = max(ans, len[v] - v);
	}
	writeln(ans);

T4

题面传送门

由于需要减去区间长度,显然以 \(\max,\min\) 为端点的区间更优。

所以,我们枚举每一个位置 \(a_i\) 作为 \(\max\),尝试寻找最优的 \(\min\) 值。

  • 如果 \(\min\)\(\max\) 左侧,不妨设 \(\max=a_r\),此时原题的式子化为:最大化 \(a_r-r-\min\{a_l-l\}-1\),可以用一个数组记录 \(a_i-i\) 的前缀最小值。

  • 如果 \(\min\)\(\max\) 右侧,不妨设 \(\max=a_l\),此时原题的式子化为:最大化 \(a_l+l-\min\{a_r+r\}-1\),可以用一个数组记录 \(a_i+i\) 的后缀最小值。

注意 \(l=r\) 也是合法的。

	read(n);
	bool flag = 1;
	rep(i, 1, n) {
		read(a[i]);
		if(i > 1 && a[i] != a[i - 1]) flag = 0;
	}
	if(flag) return writeln(-1), 0; // 其实不需要特判
	pre[0] = suf[n + 1] = inf;
	rep(i, 1, n) pre[i] = min(pre[i - 1], a[i] - i);
	Rep(i, n, 1) suf[i] = min(suf[i + 1], a[i] + i);
	ll ans = -inf;
	rep(i, 1, n) {
		if(i > 1) ans = max(ans, a[i] - i - pre[i] - 1);
		if(i < n) ans = max(ans, a[i] + i - suf[i] - 1);
	}
	writeln(ans);
posted @ 2022-07-25 10:09  Mars_Dingdang  阅读(264)  评论(0)    收藏  举报