ZROI WC Round5 题解

Problem A

题意

给定一个长度为 \(n\) 的序列,操作是交换两个相邻的数,要求将序列变成先单调不降再单调不升,求最小操作数,注意可以完全单调不降或者完全单调不升

想法

发现最小的数一定在最左侧或者最右侧

有一个暴力的做法是按照从小到大的顺序,每次看向哪边比较近就交换到哪一侧,由于不管交换到哪一个剩下的序列都是一样的,所以这个做法是正确的

下面就是优化这个算法,不难发现一个数如果移动到最左侧,那么它左侧的比它小的数肯定都移动到左侧,所以可以用树状数组算出每个数向左或者向右最终的位置,统计一下即可得到答案

Review

有一个错误的直观想法就是认为一定存在一条分界线,然后把两边的数排序

它的错误在于不能处理一边排序,一边仍旧是一个山峰形状但是山峰和排好序的一边能够平起来的情况

这种题一般都考虑最大或最小值的最终位置,考场上我一直在考虑最大值的位置,事实上最大值并不能将序列分成两部分,所以应当考虑最小值的位置

Problem B

题意

有一个 \(01\) 矩阵,求 \(\sum_{i=1}^{n}\sum_{j=1}^{m}i\times j \times rank(T(A,i,j))\) 对 \(998244353\) 取模的值,其中 \(rank\) 表示矩阵的秩,\(T(A, i, j)\) 表示矩阵 \(A\) 把 \((i,j)\) 这一位翻转之后的矩阵

题解

有两种做法,暂时只写会的一种

考虑暴力怎么写,就是直接枚举每一行,然后把除了这一行以外的玩意全部压进线性基里面,然后枚举这一行每一个位置,把它翻转,然后往线性基里面扔,复杂度 \(O(\frac {n^4m} {32})\) (竟然能过 \(n=100\) 的点)

首先不难发现可以分治,这样就把一个 \(O(n)\) 变成了 \(O(\log n)\),\(solve(l, r)\) 表示询问第 \(l\) 行到第 \(r\) 行之间的答案,然后就可以先修改一半询问另一半再撤回修改操作(基础分治)

这样复杂度 \(O(\frac {n^3m \log n} {32})\),还是不行,需要跑 \(4\) 到 \(5\) 秒

然后只能考虑在询问某一行上减少复杂度

我们发现对于某一行,翻转不同的两个位置,差距实际上很小

所以我们考虑先不翻转任何一位,直接塞进线性基里,然后修改第 \(j\) 位的时候直接和线性基里面的第 \(j\) 个异或即可

但是这样可能会错误,观察发现错误原因是你和第 \(j\) 位直接异或会导致第 \(j\) 位后面的某些位又变成 \(1\) 了,所以我们需要一个最简线性基,这并不难实现,我们在每一次插入数的时候,假设插入 \(x\) 在第 \(j\) 位上,我们先把它化简,就是把这一位之后的位置在线性基里面跑一遍,尽量异或成零,然后把这一位之前的数化简,就是如果存在一个更高位对应的数里面这一位是 \(1\),就跟现在这个数异或,这样保证每一个位置对应的数都已经尽量满足除了那个位置都是零,保证了正确性

代码很简单


inline void fuck(int dep, int p) {
rrep(i, p - 1, 1) if (b[dep][p][i] && b[dep][i].any()) b[dep][p] ^= b[dep][i];
rrep(i, m, p + 1) if (b[dep][i][p]) b[dep][i] ^= b[dep][p];
}

这样的话,我们没有办法撤销操作,所以我们记录下每一层的线性基,也就是上面代码中的 \(b[dep]\)

综上所述,复杂度 \(O(\frac {n^2m\log n} {32})\),实际上跑的很快,\(n=1000\) 大概跑 \(300 \sim 400ms\)

Review

每个部分都不难,但是合起来有些难度

想法很自然,每个修改内部做到线性的方法很巧妙

Problem C

题意

给定一些集合 \(A_1,A_2,A_3,\dots,A_k\),定义一个集合 \(A\) 能将两个集合 \(X,Y\) 分离当且仅当满足以下两个条件之一:

  • \(X \subseteq A\) 且 \(Y \cap A = \emptyset\)
  • \(Y \subseteq A\) 且 \(X \cap A = \emptyset\)

求有多少个 \(X,Y\) 满足 \(X,Y \subseteq \{1,2,3,\dots, n\}\) 且满足至少存在一个 \(A_i\) 能够将 \(X,Y\) 分离

题解

不难发现是一道容斥题

如果直接暴力枚举哪些 \(A\) 能够将两个集合分离,会存在问题,就是当 \(X \subseteq A\) 且 \(Y \cap A = \emptyset\) 的时候会存在另外一个 \(A\) 未被选择但是满足 \(Y \subseteq A\) 且 \(X \cap A = \emptyset\),这样并没有办法去重

所以我们得枚举哪些集合是 \(X\) 的超集,哪些集合是 \(Y\) 的超集,并且满足所有 \(X\) 的超集都与 \(Y\) 无交,\(Y\) 的超集与 \(X\) 无交

这样枚举完了之后扫一遍看哪些数还能被 \(X\) 选,哪些数还能被 \(Y\) 选,然后算一下就好了,复杂度 \(O(3^m n)\),期望得分 \(70\) 分

我们假设将所有的 \(A_i\) 分成 \(U\) 和 \(V\),满足 \(U\) 里面的 \(A_i\) 都是 \(X\) 的超集,\(V\) 里面的 \(A_i\) 都是 \(Y\) 的超集,也就是说,如果某个数 \(a\) 是 \(X\) 的一个元素,则 \(a\) 满足是所有 \(U\) 中集合的元素,而且不是任何一个 \(V\) 中集合的元素,瓶颈在于枚举 \(U,V\)

我们考虑枚举 \(a\),对于每一个元素 \(a\),我们预处理出包含 \(a\) 的所有 \(A_i\) 为 \(f(a)\)

这时候我们枚举 \(S=U+V\),之前的瓶颈在于还得枚举一个 \(U\) 是 \(S\) 的子集,但是我们发现这样的 \(U\) 必须满足是某个元素的 \(f\) 值,所以这样的 \(U\) 最多只能有 \(n\) 个,同样 \(V\) 最多也只能有 \(n\) 个,所以复杂度 \(O(2^mn)\),可以通过此题

Review

容易陷入枚举哪些 \(A\) 能够将两个集合分离的误区,事实上正解也是这个,但是实际上是在枚举 \(U+V\),本质不同

所以需要先想出 \(70\) 分的暴力,才有希望想到正解,暴力还是比较自然的

ZROI WC Round5 题解的更多相关文章

  1. ZROI WC Round1 题解

    ZROI WC Round1 题解 Problem A 题意 一个 \(n \times m\) 格子图,一个人从左上角出发,每次向右或者向下走一格,方法如下: 如果他在最下面一排,那么他会往右行走. ...

  2. WC 2018 题解

    WC 2018 题解 一些感受.jpg 题目难度相较前些年会相对简单一点?(FAKE.jpg 平均码量符合WC风格?(甚至更多一点 出题人良心! [WC2018] 通道 一个不知道对不对的$\log ...

  3. ZROI 部分题目题解

    ZROI 部分题目题解 335 首先发现一个性质: 对于最短的边而言,所有点的路径如果经过了这条边,那么路径的权值就是这条边的边权(废话) 那么我们把最短的边拎出来,可以发现,博物馆确定时,每个点按照 ...

  4. 【待填坑】bzoj上WC的题解

    之前在bzoj上做了几道WC的题目,现在整理一下 bzoj2115 去膜拜莫队的<高斯消元解xor方程组> bzoj2597 LCT维护MST bzoj1758 分数规划+树分治+单调队列 ...

  5. 【ZROI 537】贪心题 题解

    [ZROI 537]贪心题 题解 Link Solution 最大的一边直接放到一起贪心即可 着重讲小的一边 已知对于二分图匹配,其答案即为最大流 令时间集合为 \(T = {1,2,3,\dots, ...

  6. 2019PKU\THU WC题解

    PKU: 机试: d1t1: 考虑拓扑序的合法性,每个点的入边必须先加入.f[S]表示先出来的是S集合的点,对应边的方案数.加入x的时候,把入边方向确定,出边自然后面会确定的 2^n*n d1t2: ...

  7. WC总结

    去了人生中第一次全国WC,在四川绵阳南山中学举行,去了这么一次,感受颇多,不忍心白白地让时间流逝,于是写篇随笔记录一下. 全程,共计8天. [第1天] 签到,拿餐票,看了看讲义,觉得要狗带. 开营仪式 ...

  8. BZOJ2253: [2010 Beijing wc]纸箱堆叠

    题解: 其实就是求三维偏序最长链.类似于三维逆序对,我们可以用树状数组套平衡树来实现. DP方程 :f[i]=max(f[j]+1) a[j]<a[i] 我们按一维排序,另一位建立树状数组,把第 ...

  9. BZOJ2252: [2010Beijing wc]矩阵距离

    题解: 我脑子里都是翔??? bfs一下就行了 我居然还想什么kd tree!真是too naive,,, #include<cstdio> #include<cstdlib> ...

随机推荐

  1. hihocoder1075【开锁魔法】

    hihocoder1075[开锁魔法] 题意是给你一个 \(1-n\) 的置换,求选 \(k\) 个可以遍历所有点的概率. 题目可以换个模型:有 \(n\) 个球,有 \(cnt\) 种不同的颜色,求 ...

  2. Smack编程库进行代码功能调试

    http://www.tuicool.com/articles/U3Afiy 使用Smack编程库进行代码功能调试 关于Smack编程库,前面我们提到,它是面向Java端的api,主要在PC上使用,利 ...

  3. STM32中IO口的8中工作模式

    该文摘自:http://blog.csdn.net/kevinhg/article/details/17490273 一.推挽输出:可以输出高.低电平,连接数字器件:推挽结构一般是指两个三极管分别受两 ...

  4. HihoCoder1672 : 区间问题([Offer收割]编程练习赛41)(贪心)

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定N个区间[Ai, Bi],请你找到包含元素最少的整数集合S,使得每个区间都至少有两个整数在S中. 例如给定三个区间[1 ...

  5. JXL 的API

    使用Windows操作系统的朋友对Excel(电子表格)一定不会陌生,但是要使用Java语言来操纵Excel文件并不是一件容易的事.在Web应用日益盛行的今天,通过Web来操作Excel文件的需求越来 ...

  6. 1076 Forwards on Weibo (30)(30 分)

    Weibo is known as the Chinese version of Twitter. One user on Weibo may have many followers, and may ...

  7. ACM学习历程——HDU1331 Function Run Fun(锻炼多维dp的打表)

    Description We all love recursion! Don't we?        Consider a three-parameter recursive function w( ...

  8. 【Opencv】直方图函数 calchist()

    calchist函数需要包含头文件 #include <opencv2/imgproc/imgproc.hpp> 函数声明(三个重载 calchist函数): //! computes t ...

  9. php之配置redis

    Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. 配置说明:https://www.cnblogs.com/lucky-man/p/8359110.html ph ...

  10. Oracle的case 用法

    1.测试表declare @stuinfo table(id int, sname nvarchar(20), ///小组名称 gender varchar(1), //小组性别 sgroup int ...