更详细的性质证明——JOISC2017 切符の手配题解
Update
- 性质
2 中的“并集”已改为“交集”。( 2024.10.31 )
形式化题意:
给定正整数
你需要对序列
- 选择任意一个整数
k\in[0,c_i] 。 - 将所有
j_0\in [l_i,r_i] 的a_{j_0} 加上k 。 - 将所有
j_1\in [1,l_i)\cup(r_i,n] 的a_{j_1} 加上c_i-k 。
请你最小化
思路:
推性质神仙题。
这道题,某些人通过猜结论,调着调着就过拍了,然后交上去过了。
不得不说,这道题的性质太妙了,感觉只能通过打表看出来……
\textbf{Subtask 1}\sim\textbf{2} :
我们不妨先抛开
记多重集
性质
1 :答案具有单调性。我们记答案的上界为T 。如果存在一种反转方案,使得\max a_i=x ,则对于所有y\in(x,T] ,也存在一种反转方案使得\max a_i=y 。
这说明,我们可以尝试用二分答案解决这个问题。
性质
2 :若S 中的所有区间之交为空,则这种反转方案一定不优。证明:显然,此时存在区间
U_1,U_2\in S ,满足U_1\cap U_2=\varnothing ,如果我们同时反转这两个区间,我们讨论反转后产生的贡献:
- 所有
i\in U_1\cup U_2 的a_i 不变。- 所有
j\notin U_1\cup U_2 的a_j 会加上2 。由于反转后没有
a_i 会减少,所以这种反转方案不优。
也就是说,如果这
我们尝试二分答案
我们记
此时我们能够发现,如果我们确定了
至此,我们可以通过枚举
注意,因为
对于
对于
这里给出贪心算法的代码:
// 所有变量名与之前约定的记号含义相同
// 所有三元组 (li,ri,ci) 都存储在 vec[li] 中
// 保证 zt 从下界 max(pi) - x 开始枚举
bool valid(long long x, int t, long long zt) {
for (int i = t + 1; i <= n; i ++) {
z[i] = 0;
}
std::priority_queue<Interval> q;
long long zi = 0;
for (int i = 1; i <= t; i ++) {
long long lim = (p[i] + zt - x + 1) >> 1;
for (int j = 0; j < vec[i].size(); j ++) {
if (vec[i][j].r > t) {
q.push(vec[i][j]);
}
}
while (q.size() && zi < lim) {
Interval iter = q.top();
q.pop();
int delta = std::min(lim - zi, (long long) iter.c);
zi += delta;
z[iter.r] -= delta;
if (iter.c -= delta) {
q.push(iter);
}
}
if (zi < lim) {
return false;
}
}
z[t] = zi;
for (int i = t + 1; i <= n; i ++) {
if (((z[i] += z[i - 1]) << 1) < p[i] + zt - x) {
return false;
}
}
return true;
}
其中 Interval 类和变量 vec 的定义如下:
class Interval {
public:
int l, r, c;
bool operator < (const Interval& rhs) const {
return r < rhs.r;
}
};
std::vector<Interval> vec[maxn];
比较明显的是,如果略去枚举
\textbf{Subtask 3} :
贪心算法的时间复杂度看起来已经不可优化了,我们尝试挖掘更多的性质,优化枚举
性质
3 :存在一种最优方案,满足|S|=0 或\max_{i\in I}q_i\geq \max q_i-1 。证明:我们假设命题不成立,并尝试推导出矛盾。根据条件,当前最优方案满足
\max_{i\in I}q_i\leq \max q_i-2 。首先我们证明,当前方案中不存在区间
U\in S 使得U=I 。实际上,假设存在这样的区间,我们考虑将
U 从S 中删除,即不翻转U 。记S' 为删除U 后的多重集S ,q_i' 为删除U 后的q_i 。我们分析q_i 与q_i' 的关系:
- 对于所有
i\notin I ,q_i'=q_i-1 。- 对于所有
j\in I ,q_j'=q_j+1 。显然,
q_i 满足x=\arg\max q_i\notin I ,则q_x'=q_x-1 。为了保证S 的最优性,我们只好让\max q_i'\geq q_x ,由此可推导出\arg\max q_i'\in I ,进而得到\max q_i'=\max_{i\in I}q_i+1\geq q_x=\max q_i ,此与假设矛盾。因此,当前方案中不存在这样的区间。同时,我们可以得知当前方案中,S 中一定存在一个左端点为L 的区间和一个右端点为R 的区间(其中I=[L,R] ,且这两个区间不同)。现在,我们考虑以下调整算法:
- 如果当前
|S|\leq 2 或者已满足\max_{i\in I}q_i\geq \max q_i-1 ,结束调整。- 否则,我们从
S 中分别选择一个左端点为L 的区间和一个右端点为R 的区间,然后将它们从S 中删除。显然,这样调整后的方案仅仅只对于所有i\in I 的q_i 增加了2 ,其它的q_i 不增,不劣于最优方案。然后我们回到步骤 1。我们对当前方案进行以上调整算法,然后得到新的多重集
S_0 。若当前方案
S_0 仍然有\max_{i\in I}q_i\leq \max q_i-2 ,一方面,我们容易知道S_0 满足|S_0|\leq 2 ;另一方面,我们在之前已经证明,若当前方案满足\max_{i\in I}q_i\leq \max q_i-2 ,则不存在区间U\in S_0 使得U=I ,因此|S_0|\not=1 。综合这两方面,我们得知|S_0|=2 。所以,我们仍然从
S_0 中分别选择一个左端点为L 的区间和一个右端点为R 的区间,然后将它们从S 中删除。容易知道这样的调整一定不劣于最优方案。调整后|S_0|=0 ,此与假设矛盾。综上所述,命题成立。
这说明我们不需要大范围地枚举
总时间复杂度降至
\textbf{Subtask 4}\sim\textbf{5} :
既然我们优化掉了枚举 我们随便猜一个结论然后跑一遍, 可以发现:
性质
4 :令t=\arg\max_{i\in I}q_i ,若存在一种最优方案S(|S|>0) 满足q_t\geq \max q_i-1 ,则S 同时满足p_t=\max p_i 。证明:仍然考虑反证。若存在最优方案
S(|S|>0) 满足q_t\geq \max q_i-1,p_t\leq\max p_i-1 ,则我们可推导出x=\arg\max p_i\notin I ,因此S 中至少存在一个区间没有覆盖到x ,即z_x\leq z_t-1 。我们得到p_x\geq p_t+1,z_x\leq z_t-1 注意到,
q_x=p_x-2z_x+z_t,q_t=p_t-z_t ,所以我们尝试对上述不等式做变换得到\begin{aligned}p_x-2z_x&\geq p_t-2z_t+3 \\p_x-2z_x+z_t&\geq p_t-z_t+3 \\q_x&\geq q_t+3\end{aligned} 此与假设条件
q_t\geq \max q_i-1 矛盾。因此命题成立。
至此,我们又将
既然都到这一步了,我们继续猜测,是不是我们只要让
性质
5 :若存在一种最优方案S(|S|>0) 满足\max_{i\in I}q_i\geq \max q_i-1 ,则S 同时满足\{x|p_x=\max p_i\}\subseteq I 。证明:类似性质
4 的证明,我们考虑反证。令t=\arg\max_{i\in I}q_i ,若当前最优方案S 满足q_t\geq \max q_i-1 ,且存在x 满足x\notin I,p_x=\max p_i ,则我们有p_x=p_t,z_x\leq z_t-1 综合上述不等式可得
\begin{aligned}p_x-2z_x+z_t&\geq p_t-z_t+2 \\q_x&\geq q_t+2\end{aligned} 此与假设条件
q_t\geq \max q_i-1 矛盾。因此命题成立。
据性质
总时间复杂度降至