P2123 皇后游戏

image.png

很显然对于上式,要使得每一个 cic_i 尽可能小,因为 ci1c_{i-1} 尽可能小,cic_i 也会尽可能小。

作如下考虑

x,x,x,x,j,i,x,x,x,xx,x,x,x,j,i,x,x,x,x

x,x,x,x,i,j,x,x,x,xx,x,x,x,i',j',x,x,x,x

假设有两个相邻的位置 ci,cjc_i,c_j,在什么情况下交换 ci,cjc_i,c_j 能使 cjc_j 减小。

sumi=j=1iajsum_i=\sum\limits_{j=1}^i a_j.

那么有

cj=max(cj1+bj,sumj+bj)c_j=max(c_{j-1}+b_j,sum_j+b_j)

ci=max(cj,sumi)+bi=max(cj1+bj+bi,sumj+bj+bi,sumi+bi)c_i=max(c_{j},sum_i)+b_i=max(c_{j-1}+b_j+b_i,sum_j+b_j+b_i,sum_i+b_i)

交换后有

ci=max(cj1+bi,sumiaj+bi)c_{i'}=max(c_{j-1}+b_i,sum_i-a_j+b_i)

cj=max(cj1+bi+bj,sumiaj+bi+bj,sumi+bj)c_{j'}=max(c_{j-1}+b_i+b_j,sum_i-a_j+b_i+b_j,sum_i+b_j)

那么 cjcic_{j'} \ge c_i 这说明 jjii 前面。

首先,如果 ci=cj1+bj+bic_i=c_{j-1}+b_j+b_i,那么 cjcic_{j'} \ge c_i 一定成立(很好理解吧)。

所以在比较 cj,cic_{j'},c_i 时可以忽略 cj1+bj+bic_{j-1}+b_j+b_i.

所以只需要比较

max(sumiaj+bi+bj,sumi+bj)max(sumj+bj+bi,sumi+bi)max(sum_i-a_j+b_i+b_j,sum_i+b_j) \ge max(sum_j+b_j+b_i,sum_i+b_i)

max(sumiaj,sumibi)max(sumj,sumibj)max(sum_i-a_j,sum_i-b_i) \ge max(sum_j,sum_i-b_j)

然后再减 sumisum_i,注意 sumjsumi=aisum_j-sum_i=-a_i

max(aj,bi)max(ai,bj)max(-a_j,-b_i) \ge max(-a_i,-b_j)

min(aj,bi)min(ai,bj)min(a_j,b_i) \le min(a_i,b_j)

也就是说,如果上式满足,则有 jjii 前面。

但不具备传递性,也就是假设有 jjii 前面且 kkjj 前面,不一定有 kk
ii 前面。

分类讨论

  1. aibia_i \le b_i 则有 ajaia_j \le a_iajbja_j \le b_j 这一组按aa升序排列。

  2. ai>bia_i > b_i 则有 bjbib_j \ge b_ibjajb_j \ge a_j 这一组按bb降序排列。

如果 aibiabs(aibi)0\dfrac{a_i-b_i}{abs(a_i-b_i)}\le 0,分到11.

如果 aibiabs(aibi)>0\dfrac{a_i-b_i}{abs(a_i-b_i)}> 0,分到22.

代码就很好写了,记得long long