2017 蛤省集训
见到小火车好开心
7.7
壹
7.8
壹
给出 n,m ,求满足 k≤n 且 ∑kiμ(i)=m 的一个可能的 k 。
n<=1010
我们直接用线性筛求莫比乌斯函数的话,可以得到 60 分;剩下的分数用杜教筛可以解决。
贰
给出 n∗m 的矩阵,有一些格子是特殊的,我们一次可以从底层的相邻列中取出不超过 3 个格子(即为正或反的 “L” 型),求最少要操作几次能把所有的特殊各自取出。
2≤n,m≤2000
首先,对结果有影响的只有最上面的特殊格子,我们可以将题目转化成一维的。
很明显,我们不管前面的格子是如何消除的对后面的计算没有影响,所以考虑 DP 。
我们设
f(i,j)
表示
1 n
列都消除完的情况下,第 i 列还剩 j 个格子时的操作次数,则答案为
f(n,0)
。
考虑对于第
i
列,我们有每次消除的时候都有 2 种方式(消除 1/2 个),那么,我们枚举消除两个的操作为
至此,我们的思路已经成型,而上述状态转移方程的时间复杂度为 O(N3) ,我们还需要进一步优化。
7.9
壹
有 i 个人分钱,由第
i 个人提出一个分配方式,然后这 i 个人进行投票,如果赞成的人数小于Vi ,则这个人会被踢出。对于每个人,都会优先考虑自己不被踢出,然后考虑尽量多的拿钱,最后,在同等情况下,还希望尽量多的踢出别人。现在有 n 个人,总钱数为k ,每次钱 i 个人分钱,求第i 次分钱时第 i 个人最多分多少钱,一定会被踢出的人输出−1 。n≤106,k≤1018 ; 时限 20s
这道题很水,难就难在题意的理解也不知道是出题人语文差还是我的语文差
我一直不明白的一点就是到底什么时候一个人会投票,其实,只要一个人分钱时,给我的钱大于之前所有人给我的钱的最大值,那就投他的票(根据尽量多踢人的原则,如果一样还不投);那么我作为分钱的人,只要收买最好收买的人就好,然后剩下的钱就归我了。
对于第
i
个人,我们维护前
贰
布尔函数的定义域为全体长度的 01 串,值域为 {0,1} 。
有四种集合的元素是布尔函数:
Z : 满足f(0,0,…,0)=0
P :满足f(1,1…,1)=1
D :满足!f(a1,a2,…,an)=f(!a1,!a2,…,!an)
A :满足 若f(a1,…,ai−1,x,ai,…,an)=f(a1,…,ai−1,y,ai,…,an) 则 f(b1,…,bi−1,x,bi,…,bn)=f(b1,…,bi−1,y,bi,…,bn)现在给出一个由 Z,P,D,A 四个集合和 交、并、补、差 四种运算以及括号(括号优先级最高,补集运算的优先级高于其他三个)组成的表达式,求值。
n,L≤100 ,答案对 106+3 取模。
我考场上没看懂 A 集合的意义,写了 20 分的暴力,其实方法跟正解一样,只是数学公式没推出来。
其实,我们发现,只有四种集合的话,那么我们将全集分成 16 份就可以计算了。
叁
给出一张
n 个点 m 条边的有向有重边无环图,k 个人同时想从一号点走到 n 号点,每个人每个时刻都必须沿着一条边走,除非他已经到达了n 号点,且每条边在一个时刻只能走一个人,问最慢的人最快在什么时候能到达 n 号点,无解输出−1 。n≤100,m,k≤1000
震惊!暴搜+玄学哈希竟然过了最大的点,然而前面 T 了,得了 30 。
其实,看到这数据范围,还有不同时刻可以走的边不同,还是很多人,应该能想到分层图+网络流的
可是我被前面的题吓怕了只好暴力啊啊啊就是对每个时间建一层图,然后注意一层的 n 号节点要连上上一层的
n 号节点(可以在 n 号节点停留),然后对于其他节点,不向上一层中自己对应的点连边(保证一定要走);然后二分答案,跑最大流判断即可。7.10
壹
给出一个
n ,求满足以下条件的三元组:
- 三个元素的和等于 n ;
- 三个位置上每个数只能出现一次.
并且要求给出一组解.
n≤105 首先需要解决个数的问题,设个数为 k 我们只考虑第一位的话,那么最理想的情况应该是首位为
0 到 k−1 的各有一个,且后两位也是这些数的排列(当然可能有非此情况的最优解,不过我们只考虑这种用来计数)。我们根据总和相等可得:
3k(k−1)2=nk⟹k=23n+1然后我们考虑构造一组可行解
贰
A, B, C 三人分别有 N,M,K 张牌的牌堆,每张牌代表着一个人。首先 A 开始行动,轮到某人时从他的牌堆顶翻出一张牌,之后这张牌所代表的那个人行动,若轮到某人时其牌堆为空,则此人胜利,求在牌的 3N+M+K 种可能情况中,在多少种情况下 A 胜利,答案对 109+7 取模。
N,M,K≤3×105
直接按原问题的思路做的话,最优的时间复杂度是 O(N3) ,所以考虑将原问题转化一下。
可以这样:有一个 N+M+K 的牌堆,每个人有一个计数器,初始时 a=1,b=0,c=0
A 能胜利,当且仅当在 b>M,c>K ,首先达到 a>N .
我们考虑枚举 A 胜利的位置,然后枚举一下 A 胜利之前抽到代表 B 的牌数,之后只需要用组合数公式求出对答案的贡献然后将所有情况相加即可。
然而上述算法是 O(N2) 的,我们还需要优化。
我们发现其实没必要枚举 A 胜利之前抽到代表 B 的牌数,只需要将 B
和 C 的取牌方案容斥一下,7.11
壹
给定 3 个长度为
N 的排列 A,B,C ,求有多少二元组 (x,y) 满足 Ax<Ay,Bx<By,Cx<Cy 。N≤2×106
看起来是个三维偏序裸题,可以用排序+ CDQ 分治+树状数组解决,但是复杂度太高;其实我们只要用逆序对的方法,分别求出 A,B 和 B,C 两两之间的逆序对即可,这样从 N(N−1) 种情况减去不合法情况,由于算了两次再除以二即可。
贰
给出一个 N 次多项式
Q(x) ,和一个 N−2 次多项式 P(x) 。 Q(x) 用零点表达法表示为 Q(x)=∏Ni=1(x+ai) ,保证 Q(x) 是一个首一多项式;且 x>0 时, Q(x)≠0 ;此外, ai 各不相同。 P(x) 用系数表达法表示 P(x)=∑N−2i=0bi⋅xi 。求 ∑∞i=1P(i)Q(i) ,为避免精度误差,设答案为 pq ,输出时只需输出一行一个非负整数 x∈[0,109+7) ,使得 x⋅q≡p(mod109+7) .
N≤5000