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);

浙公网安备 33010602011771号