ZROI WC Round5 题解

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\) 分的暴力,才有希望想到正解,暴力还是比较自然的

原文地址:https://www.cnblogs.com/wawawa8/p/10274335.html

时间: 2024-08-30 06:10:07

ZROI WC Round5 题解的相关文章

【待填坑】bzoj上WC的题解

之前在bzoj上做了几道WC的题目,现在整理一下 bzoj2115 去膜拜莫队的<高斯消元解xor方程组> bzoj2597 LCT维护MST bzoj1758 分数规划+树分治+单调队列 bzoj2595 斯坦纳树,一类用spfa转移的dp,具体可以膜拜<spfa算法的优化及应用>(我是不会插头的蒟蒻) bzoj2597 补集思想之后就变成了显然的平方流 bzoj3052 树上带修改莫队算法(如果一无所知的话,可以按2038 1086 3757 3052的顺序做) bzoj145

【ZROI 537】贪心题 题解

[ZROI 537]贪心题 题解 Link Solution 最大的一边直接放到一起贪心即可 着重讲小的一边 已知对于二分图匹配,其答案即为最大流 令时间集合为 \(T = {1,2,3,\dots,maxt}\) 对于每一门课程,按照如下方式建图: 每个任务为一个点,每个时间为一个点,每个任务向其对应的时间区间连边,源点向每个任务连边,边权为 \(1\),每个时间向汇点连边,边权为 \(1\) 考虑第一门课程: 我们选择一些时间节点分给它,设为 \(T_1\) 假设最大流中任务集合为 \(A\

2019PKU\THU WC题解

PKU: 机试: d1t1: 考虑拓扑序的合法性,每个点的入边必须先加入.f[S]表示先出来的是S集合的点,对应边的方案数.加入x的时候,把入边方向确定,出边自然后面会确定的 2^n*n d1t2: 虚树,点数=边数+1,NTT, 先咕咕咕 d1t3: 地主斗... 炸弹,火箭先处理 剩下牌的特征值(每个方式最大的),以及对应的牌数 hash表存一下 然后再找B的 特征值要状压,还要边加入边计算特征值. d2t1: a[i]=0的部分分: 分成n段 每个点在每个段的方案数有相同之处 f[i][j

Codeforces Round #FF (Div. 2) 题解

比赛链接:http://codeforces.com/contest/447 A. DZY Loves Hash time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output DZY has a hash table with p buckets, numbered from 0 to p?-?1. He wants to insert n 

BZOJ2253: [2010 Beijing wc]纸箱堆叠

题解: 其实就是求三维偏序最长链.类似于三维逆序对,我们可以用树状数组套平衡树来实现. DP方程 :f[i]=max(f[j]+1) a[j]<a[i] 我们按一维排序,另一位建立树状数组,把第三维插入到每个树状数组的节点里. 除了权值之外每个节点还要保持一个mx,表示该子树内最大的f[i]. 这样就可以nlg^n了 UPD:试了下不带旋转的treap果然会被卡 orz 代码: 1 #include<cstdio> 2 3 #include<cstdlib> 4 5 #inc

BZOJ2252 [2010Beijing wc]矩阵距离

2252: [2010Beijing wc]矩阵距离 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 624  Solved: 304[Submit][Status][Discuss] Description 假设我们有矩阵,其元素值非零即1 a11…… a1m ……………. an1…….anm ?定义aij与akl之间的距离为D(aij,akl)=abs(i-k)+abs(j-L) ?? Input 输入文件的第一行为两个整数,分别代表n和m.

【BZOJ2253】[2010 Beijing wc]纸箱堆叠 cdq分治

[BZOJ2253][2010 Beijing wc]纸箱堆叠 Description P 工厂是一个生产纸箱的工厂.纸箱生产线在人工输入三个参数 n p a , , 之后,即可自动化生产三边边长为 (a mod P,a^2 mod p,a^3 mod P)(a^4 mod p,a^5 mod p,a^6 mod P)....(a^(3n-2) mod p,a^(3n-1) mod p,a^(3n) mod p)的n个纸箱.在运输这些纸箱时,为了节约空间,必须将它们嵌套堆叠起来.一个纸箱可以嵌套

HAOI2018 简要题解

这套题是 dy, wearry 出的.学长好强啊,可惜都 \(wc\) 退役了.. 话说 wearry 真的是一个计数神仙..就没看到他计不出来的题...每次考他模拟赛总有一两道毒瘤计数TAT 上午的官方题解可以看 dy0607 的博客,写的挺详细的. 「HAOI2018」奇怪的背包 题意 小C非常擅长背包问题,他有一个奇怪的背包,这个背包有一个参数 \(P\) ,当他向这个背包内放入若干个物品后,背包的重量是物品总体积对 \(P\) 取模后的结果. 现在小C有 \(n\) 种体积不同的物品,第

退役前的一句话题解

由于太懒了,没什么意思的题就写一句话题解了 10.07 zroi #1118 分别对\(\sum a,\sum b\)开状态开不下,考虑到\(a_i\leq b_i\),所以任意时刻都有\(\sum a\leq \sum b\),所以设\(dp_{i,j}\)表示选到了第\(i\)个数满足\(\sum a\leq j\leq \sum b\)的最小代价,显然有转移\(dp_{i,j}=\min_{k=j-b_i}^{j-b_i}dp_{i-1,k}+c_i\),单调队列优化转移即可 zroi#1