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 题解 直接 ...
随机推荐
- 【c++ Prime 学习笔记】第3章 字符串、向量和数组
string和vector是两类最重要的标准库类型 strng表示可变长的字符序列 vector存放某种给定类型对象的可变长序列. 3.1 命名空间的using声明 using namespace:: ...
- gridlayout在kv中的引用
from kivy.app import App from kivy.uix.gridlayout import GridLayout class GridLayoutWidget(GridLayou ...
- 你知道什么是JUC了吗?
多线程一直Java开发中的难点,也是面试中的常客,趁着还有时间,打算巩固一下JUC方面知识,我想机会随处可见,但始终都是留给有准备的人的,希望我们都能加油!!! 沉下去,再浮上来,我想我们会变的不一样 ...
- Java:并发笔记-05
Java:并发笔记-05 说明:这是看了 bilibili 上 黑马程序员 的课程 java并发编程 后做的笔记 4. 共享模型之内存 本章内容 上一章讲解的 Monitor 主要关注的是访问共享变量 ...
- 第七次Alpha Scrum Meeting
本次会议为Alpha阶段第六次Scrum Meeting会议 会议概要 会议时间:2021年5月4日 会议地点:线上会议 会议时长:20min 会议内容简介:本次会议主要由每个人展示自己目前完成的工作 ...
- 5.29日 Scrum Metting
日期:2021年5月29日 会议主要内容概述:人员调整,xyl同时兼顾前后端:确定表格缩放策略和新图表添加:强调任务分配,总结工作. 一.进度情况## 组员 负责 两日内已完成的工作 后两日计划完成的 ...
- Unity 3D手游对不同分辨率屏幕的UI自适应
目前安卓手机的屏幕大小各异,没有统一的标准,因此用Unity 3D制作的手游需要做好对不同分辨率屏幕的UI自适应,否则就会出现UI大小不一和位置错位等问题. 我们的项目在开发时的参照分辨率(Refer ...
- java监控JVM的内存使用情况等
以下的程序监控参数的代码,有些是从网络上获取的,此处进行一个记录是为了以后如果要用到方便记录. 1.引入jar包,为了获取一些cpu的使用率等信息 <dependency> <gro ...
- TCP/IP简述
一.TCP/IP简述 TCP/IP从字面异议看起来是指TCP和IP两种协议,实际上,它只是利用IP进行通信时必须用到的协议群的统称.具体的来说,IP或ICMP.TCP或UDP.Telnet或FTP.以 ...
- 变量命名网站 Codelf
程序员最头疼的事情除了头发以外就是给变量或函数命名,一开始学编程语言的时候还可以 abc.a1.x2 等方式命名,等到工作过程中开始真正的项目开发时,如果还是这样随意的命名,即使同事可以忍受你的 ab ...