题解 | #1013.Minimal and Maximal XOR Sum# 2023杭电暑期多校7

1013.Minimal and Maximal XOR Sum

贪心

题目大意

给定一个长度为 n n n 的排列 p p p ,每次操作可以选定一段连续子序列 p i , j p_{i,j} pi,j ,花费等同于元素个数的代价 c = j − i + 1 c=j-i+1 c=ji+1 ,使得这一段顺序反转
记使得排序变成自然排序( p i = i p_i=i pi=i )所经过的一系列操作中,每一次的代价的异或和为 x = c 1 ⊕ c 2 ⊕ ⋯ ⊕ c i x=c_1 \oplus c_2 \oplus \cdots \oplus c_i x=c1c2ci
x x x 的最大值和最小值

解题思路

排列的奇偶性定义为其所具有的逆序对数的奇偶性。任意一个n阶排列,可经过一系列对换转变为标准排列,且所做对换的次数与排列具有相同的奇偶性。

观察操作的特点可以得出,选定单一元素操作时,排列本身不发生改变,但产生 1 1 1 点代价//这意味着所得结果 x x x 的最后一个二进制位可以任意调整(和 1 1 1 做异或)

考虑使得 x x x 最小的操作方法
每次花费 2 2 2 代价做对换,最小值 x m i n x_{min} xmin 一定会落在 0 0 0 2 2 2 上。根据对换次数与排列奇偶性的关系,判断排列逆序对数的奇偶性即可,可以使用归并排序进行逆序对计数

接下来考虑使得 x x x 最大的操作方法
在排列 p p p 已经有序的情况下,考虑如何操作花费代价可以使得异或和 x x x 产生高位 1 1 1 :先花费高代价 c c c 反转某个长子序列,再连续花费 2 2 2 代价做对换将序列恢复为有序

可以发现 x x x 的最大可能二进制位数与 n n n 相同,逐位考虑转 1 1 1 记某位上的权重为 2 m < n 2^m 2m<n ,则反转 2 m 2^m 2m 个数后,恢复有序需要连续做对换的次数为 2 m ( 2 m − 1 ) / 2 2^m(2^m-1)/2 2m(2m1)/2 m ≥ 2 m\ge 2 m2 时对换次数为偶数,即对最终的异或和 x x x 无影响,这意味着按照上述策略可以将 x x x 倒数第3位(权重为4)及以前的数位全部置1//

m = 1 m=1 m=1 时对换次数为 1 1 1 ,和反转 2 1 2^1 21 个数的代价 2 2 2 抵消,因此无法变更倒数第二位的值

综上所述,只需将 x x x 调整为与 n n n 具有相同二进制数的最大值,再判断倒数第二位即可//

时间复杂度

归并排序: O ( n log ⁡ n ) O(n\log n) O(nlogn)

参考代码

参考代码为已AC代码主干,其中部分功能需读者自行实现

void solve()
{
    ll n;cin >> n;ll mn,mx;
    vector v(n);
    for(auto &x:v) cin >> x;
    ll cntinv=mergeSortAndCount(v,0,n-1);
    if(cntinv%2) mn=2;else mn=0;
    ll t=n,dig=0;while(t) {dig++;t/=2;}
    mx=(1<

你可能感兴趣的:(2023杭电多校,c++)