Codeforces Round #717 (Div.2) 题解
我 AK 的第二场(?)的 Div.2,还捡了个 rk4(虽然我 div2 only 的最高记录是 rk2)祭之(
A
这题我竟然 WA 了两发,丢人(
直接贪心,对于 \(i=1,2,\cdots,n-1\),每次拿 \(i\) 和 \(n\) 执行操作,直到 \(a_i=0\) 或用完所有操作次数为止
B
这题我竟然 WA 了一发,丢人(
题目等价于是否可以将原数组划分为 \(\ge 2\) 段满足每段异或和相同。
首先如果所有数异或和都是 \(0\),由于 \(n\ge 2\),那么随便找一个断点 \(i\in[1,n-1]\) 并将 \([1,i]\) 异或在一起,\([i+1,n]\) 异或在一起一定可以得到两个相等的数。
否则显然不可能将原数组划分成偶数段,并且每一段的异或和都是 \(S=\operatorname{xor}\limits_{i=1}^na_i\),这个直接贪心好了,就不断向右扫描,如果扫到一个前缀异或和 \(S\) 就多划分一段,然后看划分出来的段数是否 \(\ge 2\)
时间复杂度 \(\mathcal O(n)\)
C
首先我们检查是否原来的数组就是好的,这个显然可以背包检验,如果是那么直接输出 \(0\) 好了。
否则可以证明一步操作就能将原数组变为好的数组,具体构造就是找出最大的 \(k\) 满足 \(\forall i,2^k\mid a_i\) 然后令所有 \(a_i\leftarrow\dfrac{a_i}{2^k}\),然后找到满足 \(a_i\) 是奇数的下标 \(i\) 并将 \(a_i\) 删除即可,至于正确性,显然除以 \(2^k\) 是不影响数组究竟是不是好的,而由于原数组不是好的,必然有 \(\sum a_i\) 为偶数,故删去某个 \(a_i\) 是奇数的 \(a_i\) 后必然有 \(\sum a_i\) 为奇数,也就变成好的数组了,又由于 \(k\) 为最大的满足 \(\forall i,2^k\mid a_i\) 的数,这样的 \(i\) 一定存在,得证。
D
首先一个显然的性质是 \(\text{lcm}(a_1,a_2,\cdots,a_n)=a_1a_2\cdots a_n\leftarrow\forall i\ne j,\gcd(a_i,a_j)=1\),故考虑将每个数分解质因数,然后对于每个 \(l\) 找出最大的 \(r\) 满足 \([l,r-1]\) 符合条件——这个显然可以 two pointers 求出,时间复杂度 \(n\omega(a_i)\)。然后倍增一下即可。
E
这个题还算有点意思,i 了 i 了((
首先考虑对于一个排列 \(p\),最少需要多少操作才能从 \(1,2,\cdots,n\) 变成 \(p\)——显然对于一个最少操作次数为 \(x\) 的排列 \(p\),其会对 \(ans_x,ans_{x+2},ans_{x+4},\cdots,ans_{x+2t},t\in\mathbb{Z}\) 产生 \(1\) 的贡献,因为对于某个固定的 \(i,j\) 交换两次之后就会复位。而这个最小操作次数显然可以从置换的角度理解,我们将 \(p\) 拆成一个个置换环,对于一个置换环 \(x_1,x_2,\cdots,x_m\) 我们显然可以依次交换 \((x_{m-1},x_m),(x_{m-2},x_{m-1}),\cdots,(x_2,x_1)\),这样 \(m-1\) 次操作即可复位,操作次数为 \(m-1\),因此总操作次数就是 \(\sum(\text{置换环大小}-1)\)
接下来考虑怎样计算答案,考虑 \(dp\),我们记 \(dp_{i,j,k}\) 表示考虑了大小在 \([2,i]\) 中的置换环,所有置换环大小 \(-1\) 之和为 \(j\),所有置换环大小之和为 \(k\) 的方案数,转移就枚举选择了 \(c\) 大小为 \(i+1\) 的置换环,那么 \(dp_{i+1,j+ci,k+c(i+1)}\leftarrow dp_{i,j,k}\times M\),其中 \(M\) 为将 \(c\) 个大小为 \(i+1\) 的置换环塞进去的方案数,具体来说 \(M=\dbinom{n-k}{i+1}\times\dbinom{n-k-(i+1)}{i+1}\times\cdots\times\dbinom{n-k-(i+1)\times(c-1)}{i+1}\times\dfrac{1}{c!}\times(i!)^c\),前面那一坨二项式系数就是从剩余 \(n-k\) 个位置中选出 \(c(i+1)\) 个位置给这 \(c\) 个置换的方案数,\(\dfrac{1}{c!}\) 表示这 \(c\) 个置换本质上是相同的,故除以 \(c!\),后面又乘个 \((i!)^c\) 是因为长度为 \(i+1\) 的圆排列有 \(i!\) 个。这样枚举 \(i,j,k\) 再枚举 \(c\) 复杂度看似是 \(k^4\),不过不难发现 \(c\) 最多枚举到 \(\dfrac{k}{i}\),因此复杂度实际上是 \(k^3\ln k\),可以通过此题。
还有一点就是在计算 \(M\) 的过程中,我们要计算很多形如 \(\dbinom{x}{y}\) 的二项式系数的值,这里的 \(x\) 很大,因此无法预处理阶乘和阶乘逆元求出,不过注意到 \(y\) 可能的值很小,\(n-x\) 的值也很小,因此可以预处理出 \(c_{x,y}\) 表示 \(\dbinom{n-x}{y}\) 这样就不用转移的时候再 \(\mathcal O(k)\) 地计算二项式系数的值了。
据说这题 \(k\) 可以扩大到 \(2000\)?orzorz,果然还是 wtcl 了啊/kk
Codeforces Round #717 (Div.2) 题解的更多相关文章
- Codeforces Round #182 (Div. 1)题解【ABCD】
Codeforces Round #182 (Div. 1)题解 A题:Yaroslav and Sequence1 题意: 给你\(2*n+1\)个元素,你每次可以进行无数种操作,每次操作必须选择其 ...
- Codeforces Round #608 (Div. 2) 题解
目录 Codeforces Round #608 (Div. 2) 题解 前言 A. Suits 题意 做法 程序 B. Blocks 题意 做法 程序 C. Shawarma Tent 题意 做法 ...
- Codeforces Round #525 (Div. 2)题解
Codeforces Round #525 (Div. 2)题解 题解 CF1088A [Ehab and another construction problem] 依据题意枚举即可 # inclu ...
- Codeforces Round #528 (Div. 2)题解
Codeforces Round #528 (Div. 2)题解 A. Right-Left Cipher 很明显这道题按题意逆序解码即可 Code: # include <bits/stdc+ ...
- Codeforces Round #466 (Div. 2) 题解940A 940B 940C 940D 940E 940F
Codeforces Round #466 (Div. 2) 题解 A.Points on the line 题目大意: 给你一个数列,定义数列的权值为最大值减去最小值,问最少删除几个数,使得数列的权 ...
- Codeforces Round #677 (Div. 3) 题解
Codeforces Round #677 (Div. 3) 题解 A. Boring Apartments 题目 题解 简单签到题,直接数,小于这个数的\(+10\). 代码 #include &l ...
- Codeforces Round #665 (Div. 2) 题解
Codeforces Round #665 (Div. 2) 题解 写得有点晚了,估计都官方题解看完切掉了,没人看我的了qaq. 目录 Codeforces Round #665 (Div. 2) 题 ...
- Codeforces Round #160 (Div. 1) 题解【ABCD】
Codeforces Round #160 (Div. 1) A - Maxim and Discounts 题意 给你n个折扣,m个物品,每个折扣都可以使用无限次,每次你使用第i个折扣的时候,你必须 ...
- Codeforces Round #383 (Div. 2) 题解【ABCDE】
Codeforces Round #383 (Div. 2) A. Arpa's hard exam and Mehrdad's naive cheat 题意 求1378^n mod 10 题解 直接 ...
随机推荐
- UltraSoft - Beta - Scrum Meeting 5
Date: May 21st, 2020. Scrum 情况汇报 进度情况 组员 负责 今日进度 q2l PM.后端 修复了课程通知链接的bug Liuzh 前端 暂无 Kkkk 前端 增加消息中心板 ...
- 所驼门王的宝藏(Tarjan)
题目描述 在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族.被族人恭称为"先知"的Alpaca L. Sotomon是这个家族的领袖,外人也称其为"所驼门王". ...
- segyio库的使用
最近在使用segyio库读取segy文件的时候默认读取总是出现问题,经过分析发现是我们通常所用的segy格式与本库的默认格式略有不同,修改参数就可以读取: 1) with segyio.open(fi ...
- cadence 技巧
pcb中如何选中完整的一条网络? 1 edit properties 右边 find nets 2 cadence 选中不同的网络高亮 display--->assign color在opt ...
- 如何清理history
工作中,需要清理history 清理当前会话历史命令 history -c 清理当前用户所有历史命令 echo > .bash_history #在用户主目录执行此操作
- Python hashlib Unicode-objects must be encoded before hashing
Python2中没有这个问题 python3中 hashlib.md5(data)函数中data 参数的类型应该是bytes hash前必须把数据转换成bytes类型 Python 2.7.12 (d ...
- 高度最小的BST 牛客网 程序员面试金典 C++ Python
高度最小的BST 牛客网 程序员面试金典 C++ Python 题目描述 对于一个元素各不相同且按升序排列的有序序列,请编写一个算法,创建一棵高度最小的二叉查找树. 给定一个有序序列int[] val ...
- 碰撞的蚂蚁 牛客网 程序员面试金典 C++ Java Python
碰撞的蚂蚁 牛客网 程序员面试金典 C++ Java Python 题目描述 在n个顶点的多边形上有n只蚂蚁,这些蚂蚁同时开始沿着多边形的边爬行,请求出这些蚂蚁相撞的概率.(这里的相撞是指存在任意两只 ...
- hdu 1080 Human Gene Functions(DP)
题意: 人类基因由A.C.G.T组成. 有一张5*5的基因表.每格有一个值,叫相似度.例:A-C:-3.意思是如果A和C配对, 则它俩的相似度是-3[P.S.:-和-没有相似度,即-和-不能配对] 现 ...
- ThreadPoolExecutor里面4种拒绝策略(详细)
ThreadPoolExecutor类实现了ExecutorService接口和Executor接口,可以设置线程池corePoolSize,最大线程池大小,AliveTime,拒绝策略等.常用构造方 ...