2014 multi4

传送门

请务必认真对待,维护好队伍wiki,每一次自我总结都是提升总体实力的好机会

wiki三要素:题意,题解,提交失败的原因(1A的不用写)

赛后补的题请在题号后注明 

A (赛后)

题意: 给你两个长度为n(n <= 31)的01序列A, B,问A序列最少改变多少次能变成B序列。序列的一次改变是这样的,首先有两个集合S1、S2,每个集合中表示的都是下标,如果集合S1中1的个数是奇数个,那么把序列的第一个数去掉,然后在尾部加上一个数1,偶数个的话则是加上一个数0,然后将S2集合对应的位置异或一下,这就是改变了一次。

题解:由于n<=31,即可知总的不同序列个数是2^n。对于一个序列的一次改变,可以构造个转移矩阵,那么改变一次其实就是乘一次这个矩阵,设初始矩阵是A, 转移矩阵是B, 目标矩阵是C,问题就转换成求A * B^x = C (矩阵里的元素都是mod 2的)。纳尼,这不是就是在求离散对数嘛!只不过是矩阵的离散对数。那么问题就简单了,还是和求普通的离散对数一样。

矩阵离散对数的话,由于总状态数只有2^31,x不会超过总状态数,假设tot是总状态数,定义m = sqrt(tot) + 1,先处理出C * B^i  (0 <= i < m),对于每个i得到的矩阵的状态放入map中,值为i,然后枚举计算 A * B^( i*m ) (1 <= i <= m),一旦得到的状态在map里,说明找到了答案,答案即为 i*m - map(状态),这个想一下就明白的,注意初始和目标状态相同时先特判下,然后注意计算的时候不能整个矩阵相乘,整个矩阵相乘复杂度是O(n^3),由于保存的矩阵只有第一行是有效的,所以复杂度可以转化成O(n^2),这样就不会超时了。

错误原因:计算的时候整个矩阵相乘超时了,改成O(n^2)过了

 

 

B
题意:给出网格的各行各列和,试确定每个格子内的数,并问解是否唯一.
题解:建图跑网络流,然后直接在残余网络上找环,找到则说明解不唯一.
错误原因:找环姿势不正确。试图用tarjan系列缩环降低复杂度,WA,怒改暴搜...


 

C

题意:给你一个spfa的代码,要求生成一幅图使得该代码跑的节点出队列次数>C

题解:构造一组解使得spfa的节点出列次数>MAX_C即可,考虑1到2有边,然后2更新完后面之后,如果还有个节点更新了2的话,2又能进队列一次了,那么2又能更新后面一次了,照此思路可构造出2的幂次出列次数。

错误原因:

 

 

D

题意:

题解:

错误原因:

 

 

E

题意:字符串模拟题

题解:水题。。

错误原因:

 

F

题意:

题解:

错误原因:

 

 

 

G

题意:给你一个序列,有三种操作,第一种是令a(k)增加d,第二种是询问[l, r]区间元素和,第三种是令[l, r]区间所有元素分别变成最近的斐波那契数。

题解:线段树,对于每个节点标记下这个区间是否所有元素都已经变成最近的斐波那契数,对于第三种操作到了该区间就不需要递归了,由于第一种操作只修改一个元素,所以将某个元素变成最近的斐波那契数的次数最多就是修改的次数。复杂度为O(nlogn)

错误原因:

 

 

H (补)

题意:在一棵树上放m个餐厅使得控制的点数最多

题解:dp[i][j][k]表示节点i的子树用了j个餐厅且节点i被节点k控制的最大控制数量,O(n^3)搞定

错误原因:

 

 

I

题意:

题解:

错误原因:

 

 

J(赛后)

题意:

 

给你一幅这样子生成的图,求最小生成树的边权和。

 

题解:对于i >= 6的点连回去的5条边,打表知907^53 mod 2333333 = 1,所以x的循环节长度为54,所以9个点为一个循环,接下来的9个点连回去的边都是一样的。预处理出5个点的所有连通状态,总共只有52种,然后对于新增加一个点和前面点的连边状态可以处理出所有状态的转移。然后转移矩阵可以处理出来了,快速幂一下就可以了,对于普通的矩阵乘法是sigma( a(i, k) * b(k, j) ) (1<=k<=N), 现在的转移是min( a(i, k) + b(k, j)) (1<=k<=N)。这题预处理模拟的时候想想有点烦(不,是很烦),不过搞起来其实还是可以的,所以说所有题目都是纸老虎,首先不能被吓到!
错误原因:

 

posted on 2014-08-02 22:43  shenshanlaoyao  阅读(177)  评论(0编辑  收藏  举报

导航