【总结】JXOI
找不到几题啊,毫无存在感的省份。
[JXOI2017]数列
数数题。
\(n,r\) 很小,显然 DP。
模拟观察一下得到每次在数列后面接一个数,等价于将可填范围缩小。
对于当前范围我们用三元组 \((l, k, r)\) 表示,表示填的数必须在 \([l,r]\) 内,而上一个数是 \(k\)。
枚举当前位 \(i\) ,讨论一下 \(i=l/k/r\) 和 \(i < k\) 和 \(i > k\) 的情况。
所以我们记录状态 \(f[i][l][r][k]\) ,转移是连续的一段,直接前缀和优化。
[JXOI2017]颜色
由于删除后剩下的序列非空且连续,所以剩下的一定是个区间,我们计算有多少个区间可以剩下即可。
枚举右端点,计算有多少个可行的左端点。
所以我们定义状态 \(f[i]\) 表示已 \(i\) 为右端点的方案数,那么对于 \(i\) ,计算出最大的 \(j\) 使得区间 \([j,i]\) 合法,可以得到转移 \(f[i] = f[j] + 1\)。答案就是 \(\sum f\)。
计算 \(j\) 可以用线段树维护颜色。时间复杂度 \(\mathcal{O}(N\log N)\) 。
[JXOI2017]加法
比较套路的题,我们要使最小值最大,先二分答案,然后直接贪心即可。
具体的贪心策略从左往右扫一遍,如果当前位置 \(<mid\) ,那么选择可以覆盖当前位置的区间中右端点最靠右的加上即可。用堆维护决策集合即可。时间复杂度 \(\mathcal{O}(N\log^2 N)\)。
[JXOI2018]游戏
对于在一个位置 \(i\) ,如果区间 \([l,r]\) 中没有它的真约数,显然它只能被自己覆盖。否则被它的真约数覆盖一定最优,直接删掉即可。
所以我们用类似埃式筛将不必要的数删掉。剩下 \(x\) 个数,直接爆算得到答案。 复杂度不会证,反正不会劣于 \(\mathcal{O}(N\log N)\)。
[JXOI2018]守卫
关键条件,每个守卫只能看左边。
所以对于一个区间 \([l,r]\) ,第 \(r\) 个位置上一定要站一个人。
我们计算 \(r\) 位置上看到的最左边的人 \(x\),显然 \(x\) 左边的人看不到右边,\(x\) 右边的人看不到左边,就是两个子问题。然后直接动态规划即可,\(f[l][r]\) 表示区间 \([l,r]\) 需要的最少守卫数量。
[JXOI2018]排序问题
显然这个期望和初始的顺序没有关系,所以期望就是一次排序成功的倒数。
总方案数是 \(n!\) ,能排序成功的方案有 \(\prod c_i!\) 个,所以期望就是 \(\dfrac{n!}{\prod c_i!}\) 。
现在我们可以改变在 \([l,r]\) 范围内的 \(c\),显然每次在最小的上面 \(+1\) 即可,模拟一下可以做到线性。
还要排序,时间复杂度 \(\mathcal{O}(N\log N)\)。