AGC035
A
唯一会做的题/kk
题目相当于要求相邻三个的异或和为\(0\)。
当我们放入了三个数\(a,b,c\)时,接下来的放入顺序显然一定是\(a,b,c,a,b,c,...\)。所以当数可以分成三份,每份大小\(\frac{n}{3}\)且其中的数全部相等,从三份中各取一个数的异或和为\(0\)时有解,否则无解。
B
当边数为奇数的时候显然无解
否则选出一棵生成树,其他的边乱选方向,树上自底向上确定边的方向,一条树边应当使得其儿子的出度变为偶数。因为边数是偶数所以根也一定满足条件。
C
当\(n=2^k\)时显然无解
否则考虑增量构造。注意到已经给出了\(n=3\)时的答案,我们从\(4\)开始,每一次两两在树上用下图的方式将点挂在树上:
上面是一个\(n=5\)的情况,挂上的\(4,5,9,10\)点显然是满足条件的。与此同时权值为\(6,7\)、\(8,9\)、\(10,11\)...的点也可以这样做。
对于最后剩下的一个权值也不难在树上找到一条经过\(1\)和其他两个节点的路径的异或和为这个权值。
D
考虑时间倒流,也就是每一次两个位置吐出一个新的位置出来。
记录每一个位置的值自然不可取,我们可以考虑记录每一个位置对答案的贡献。最初两个位置对答案的贡献均是\(1\),接下来每一次吐出的一个位置的贡献则是其旁边两个位置的贡献之和。
接下来考虑DP:设\(f_{l,r,fl,fr}\)表示要确定区间\([l+1,r-1]\)的所有位置的贡献,\(l\)的贡献是\(fl\),\(r\)的贡献是\(fr\)时的最小贡献,转移枚举由\(l,r\)吐出来的位置的编号然后递归进入两边的DP过程。
因为每递归一层\((fl,fr)\)数量至多翻倍,所以总状态数是\(O(2^nn^2)\)的,复杂度\(O(2^nn^3)\)。
E
考虑某个集合是否合法。如果集合中同时存在\(x\)和\(x-2\)则连边\((x,x-2)\);同时存在\(x\)和\(x+K\)则连边\((x,x+K)\),那么有环显然不合法,无环时选择一个拓扑序进行删除显然合法。那么我们需要求的就是无环的集合数量。当\(2 \mid K\)时奇偶独立,对于奇数和偶数都是不能选择连续的\(\frac{K}{2}+1\)个数,这个可以简单地解决。
\(2 \not\mid K\)时则不能存在\(a>b , a \not\equiv b (\ \bmod2)\)满足\(a,a-2,...,b-K,b,b-2,...,a-K\)同时在集合内。两者都是一段连续的区间,那么可以考虑从小到大将数加入到集合中。
设\(f_{i,p,q,fp,fq}\)表示已经填入了\(1 \sim i\),当前填入的奇数段长度为\(p\)、偶数段长度为\(q\),奇数从现在开始一直填到\(fp\)就不合法,偶数从现在开始一直填到\(fq\)就不合法,满足这些条件的集合数量。
不失一般性地考虑\(2 \not\mid i+1\)的转移。首先可以选择不填\(i+1\),因为限制需要一直填到\(fp\)才不合法,此时不填则限制全部消失,即
\[f_{i,p,q,fp,fq} \rightarrow f_{i+1,0,q,N+1,fq}\]
如果填则必须要满足\(fp > i+1\)。此时如果存在一个在偶数段内的数能够通过\(K\)跳到\(i+1\),即\(i+2-2q+K \leq i+1\),则此时这个奇数段必须不能通过\(K\)跳到与当前偶数段相连的偶数位,即\(fq \leq i+1-2p+K\)。有转移:
\[f_{i,p,q,fp,fq} \rightarrow f_{i+1,p+1,q,fp,min(fq,i+1-2p+K)}\]
如果不存在这样的位置,那么就不会有限制,即
\[f_{i,p,q,fp,fq} \rightarrow f_{i+1,p+1,q,fp,fq}\]
注意到\(fp,fq\)只有\(p,q\)中较大的那一个可能不是\(N+1\),否则一定已经存在环,所以\((fp,fq)\)的数量是\(O(N)\)级别的。复杂度\(O(N^4)\),状态常数很小可以map实现。
F
当\(k_i = j-1,l_j=i\)时,可以让\(k_i\)加\(1\),\(l_j\)减\(1\),得到一个等价的状态。我们设无法进行这样操作的状态是标准状态,考虑证明标准状态与网格一一对应。一个标准状态肯定对应一个网格,只需证明一个网格对应一个标准状态。
假设有两个不同标准状态\((l,k)\)、\((l',k')\)对应相同的网格,则\(l\)与\(l'\)、\(k\)与\(k'\)必定不同。找到第一个位置\(x\)满足\(l_x \neq l'_x\),不失一般性假设\(l_x < l'_x\),则:
如果\(x=1\),则显然在两个矩阵中\(A_{l'_x,1}=1\),所以\(k_{l'_x,1}=0\),则第二个状态不是标准状态;
如果\(x \neq 1\),则两个矩阵中\(A_{l'_x , x} = 1\),必定有\(k_{l'_x} \geq x , k'_{l'_x} < x\),而因为\((k',l')\)是标准的,所以\(k'_{l'_x} \neq x-1\),所以两个矩阵中的\(A_{l'_x , x-1}\)必定不同,与假设矛盾。
所以我们只需要算标准状态的数量,考虑以下两种做法:
1、DP:设\(f_{i,j}\)表示考虑了前\(i\)列、有\(j\)行满足\(k_x \leq i\),转移枚举有多少行等于\(i-1\),则有
\[f_{i,j} = \sum\limits_{k \leq j} f_{i-1,k} \binom{j}{k} (N+1-(j-k))\]
不难发现这是一个卷积的形式,可以多项式快速幂优化,但是因为出题人没想到这种做法所以如果exp稍微慢一点就会被卡;
2、容斥:容斥有多少对\((x,y)\)满足\(k_x=y-1,l_y=x\),其余随意指定,则答案为
\[\sum\limits_{i=0}^{min(N,M)} (-1)^i \binom{N}{i} \binom{M}{i} i! (N+1)^{M-i} (M+1)^{N-i}\]
AGC035的更多相关文章
- AGC035 B - Even Degrees【思维·树形结构的妙用】
题目传送门 一句话题意: 首先,每一条边会产生1个入度,1个出度,因此,如果边的数量是奇数的话,图的所有节点的总出度就是奇数,不可能每个节点的出度都是偶数,因此无解. 有解时,我们先找出原图中的一棵生 ...
- AGC035 A - XOR Circle【分析】
题目传送门 题意简述: (就是连环的意思) 唔,这道题考场上写了个什么神仙做法,数据太水了居然过了: // #include<cstdio> #include<algorithm&g ...
随机推荐
- Android 工作流提交审批填写审批意见PopWindow工具类
公司的项目中几乎都会有走工作流这个环节,为了提高效率,现在特意把弹出的填写审批意见PopWindow改转成工具类,提高效率,免得下次又得整.先看运行效果.
- Canny算法检测边缘
Canny算法是边缘检测的一个经典算法,比单纯用一些微分算子来检测的效果要好很多,其优势有以下几点: 边缘误检与漏检率低. 边缘定位准确,且边界较细. 自带一定的滤噪功能,或者说,对噪声的敏感度要比单 ...
- CentOS7下firewall-cmd防火墙使用
一. firewalld的基本使用启动: systemctl start firewalld查状态:systemctl status firewalld 停止: systemctl disable f ...
- PAT 乙级 1091.N-自守数 C++/Java
题目来源 如果某个数 K 的平方乘以 N 以后,结果的末尾几位数等于 K,那么就称这个数为“N-自守数”.例如 3,而 2 的末尾两位正好是 9,所以 9 是一个 3-自守数. 本题就请你编写程序判断 ...
- 使用cookiecutter创建django项目
使用cookiecutter创建django项目 下载安装: pip install cookiecutter cookiecutter https://github.com/pydanny/cook ...
- texlive相关问题
1.The font "WenQuanYi Micro Hei" cannot be found. 解决方法:下载WenQuanYi Micro Hei的字体(以ttf结尾),粘贴 ...
- Python基础之函数定义及文件修改
函数 函数的定义 #登录函数和注册函数 def register(): """注册函数""" username = input('请输入你的 ...
- [RN]react-native-scrollable-tab-view和FlatList手势冲突解决
问题描述: react-native-scrollable-tab-view叠加react-native-scrollable-tab-view再加上FlatList FlatList向下拉时,会造成 ...
- idea 2018.1 创建springboot开启找回Run Dashboard
Run Dashboard 他是一个代替Run窗口的一个更好清晰简介的一个启动器.一般我们需要启动多个窗口时,Run窗口不能让我们直观的看到我们看到每一个端口的变化. 我们可以对比一下这个是Run D ...
- xcode: {} 花括号缩进一个空格
if (jsonDict.HasParseError()) { //前面总是有一个空格 CCLOG("GetParseError %d\n",jsonDict.GetParseEr ...