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. hdmap相关

    图片来源:https://vires.com/ 新闻摘抄: 对此,武汉光庭信息技术股份有限公司副总经理罗跃军告诉记者:“事实上,最初由自动驾驶车身控制系统协会所提出的地图精度要求很高,需要达到5cm甚 ...

  2. DropDownList(For)

    1.绑定数据源 方法一 Controllers:var users = GetUsers(); var selectList = new SelectList(users, "Value&q ...

  3. 插件_热部署_JRebel

    一.License Server 1.运行反向代理 GitHub地址:https://github.com/ilanyu/ReverseProxy 下载地址:ReverseProxy_windows_ ...

  4. 在线接口管理工具-eoapi

    为了方便和前端沟通,临时在局域网搭建了一个接口管理工具,查了一些资料都说eoapi不错,那就试了一下: 1.安装 要在服务器或者自己的电脑,准备web环境,Linux可以是Apache/nginx , ...

  5. hdu-1542 Atlantis(离散化+线段树+扫描线算法)

    题目链接: Atlantis Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/32768 K (Java/Others) ...

  6. PG替换字段中的回车与换行

    REPLACE(filed, CHR(10), '') //替换换行符 REPLACE(filed, CHR(13), '') //替换回车符

  7. 设置可见GPU方式

    只可见第一块GPU os.environ["CUDA_VISIBLE_DEVICES"] = "0"

  8. MMU的理解

    MMU内存管理单元相关知识点总结 1.MMU是Memory Management Unit的缩写,中文名是内存管理单元,它是中央处理器(CPU)中用来管理虚拟存储器.物理存储器的控制线路,同时也负责虚 ...

  9. CAS单点登录学习(一):服务端搭建

    下载先在网上下载cas-server-3.5.2,将里面的cas-server-webapp-3.5.2.war放到tomcat的webapps目录下. https设置cas单点登默认使用的是http ...

  10. 用Pyinstaller把Python3.7程序打包成可执行文件exe

    1.通过pip3 install pyinstaller 安装成功 2.然后执行命令,首先:需要切换到程序所在的目录 执行命令 pyinstaller -F -w <文件名.py>,-F代 ...