2017集训队作业

感觉剩下的都是丧病题了啊,弃坑。。

现已完成: [144/156]

149

自己计数水平还是菜啊,高老师老早就妙掉的题,我看了那么久题解才会做
这题正着dp也能做,但是式子比较烦,考虑倒着dp
\(dp(i,\ x)\)表示还需要连\(i\)条边使得整个图联通,当前在点\(x\)上,推出dp式子之后发现每次都是消同一个矩阵,那么把矩阵的逆求出来就好喽。。。
考虑如何计算\(i\)个点\(j\)条边的连通图数\(P(i,\ j)\)
直接dp需要\(O(n^6)\),考虑容斥
枚举一个图的一个划分,不同划分之间不能有边,则有
\(P(i,\ j)\ =\ \sum_{G}\ [V(G)\ =\ i][E(G)\ =\ j]\ \cdot (-1)^{C(G)\ -\ 1\ }\cdot (C(G)\ -\ 1)!\)
其中\(C(G)\)为图\(G\)算入\(P(i,\ j)\)的划分成的块数
我们令\(F(i,\ j)\)表示每个划分的块都必须要是完全图的\(P\)的值,最后算\(P\)的时候可以通过在完全图里随便选一些边来做
\(F(i,\ j)\)的时候有个\((C(G)\ -\ 1)!\)比较难处理,如果再开一维\(C(G)\)复杂度就会多一个\(n\),考虑\((C(G)\ -\ 1)!\)的意义
如果没有\((C(G)\ -\ 1)!\)的话,\(F(i,\ j)\ =\ \binom{M(i)\ }{j}\ -\ \sum_{k\ =\ 1}^{i\ -\ 1}\ F(i\ -\ k,\ j\ -\ M(k))\cdot\ \binom{i\ -\ 1\ }{k\ -\ 1\ }\),其中\(M(k)\)\(k\)个点的完全图的边数
每次要枚举新加入的那个划分的块,为了避免重复计数,保证每次都把包含\(1\)号点的划分块当成新加入的块
那么如果每次把任意一个划分的不包含\(1\)号点的块当成新加入的块,就正好乘了一个\((C(G)\ -\ 1)!\)

112

照着题解写了一遍,还是挺妙的
主要的变换是发现取球的顺序是可以交换考虑的,然后就是推一些式子

121

137

123

zzq's 方法: 给树边标号的时候先对重边标号,之后对于轻边按照相同的dfs顺序(先遍历重儿子)进行遍历,遍历到\(u\)节点的时候将所有\(u\)向下连的边标号,这样就可以处理对所有儿子修改的操作了

109

这题正解好无聊啊。。。就是无脑讨论题qaq
不过离线维护一般图桥边数还是挺有趣的,算法参见题解,就不多说啦>_<

108

看到平方就要拆开
有个结论:一个\(n\)个点\(m\)个条边的无向连通图按照题目构出的矩阵的秩为\(n\ -\ 1\)
可以这样理解:by zjt

124

__debug题解
在优化式子的时候如果直接推\(\Pi_{i\ = 1}^N\ \Pi_{j\ =\ 1}^{a_i}\ (a_i\ +\ b_j\ -\ i\ -\ j\ +\ 1)\)的话,算\(x\ =\ a_i\ +\ b_j\ -\ i\ -\ j\ +\ 1\)的个数时可以发现当\(j\ >\ a_i\)的时候\(x\ <\ 0\), 所以直接将\(x\ >\ 0\)的贡献算入ans即可

136

高老师的题真的非常牛逼啊,树上的方程可以通过从叶子开始消元成\(dp_u\ =\ k_u\ \cdot\ dp_{par_u}\ +\ b_u\)的形式

120

多项式板子大全(ps.在模形如\(2^k\ \cdot\ a\ +\ 1\)的质数且有原根的意义下,多项式开根只支持常数项为1)
如果在使用过程中出锅了请联系我
如果数据范围过大,可能new int的时候会RE,把new int改成static int即可
本代码常数较大,可能会被卡常

144

将等差数列写成\(kx\ +\ b\)的形式,当成多项式处理
次数为\(n\)的多项式,求\(q\)个点的值的复杂度为\(O(qlog^2q\ +\ nlognlogq)\)

155

看到题面里的那种几个和为\(m\)的数乘起来,然后再乘上\(\frac{1}{i!}\)的形式应该想到\(e^{A(x)}\)
如果系数是\(\frac{1}{(i\ -\ C)!}\)的话可以用\(A(x)^C\ \cdot\ e^{A(x)}\)

133, 146

三方log的解法也是非常妙的,也就是题解里的算法三,虽然A不掉,但是非常有启发性
对于任意函数\(n\)次差分后,\(\Delta^n\ f(x)\ =\ \sum_{i\ =\ 0}^n\ (-1)^{n\ -\ i}\ \binom{n}{i}\ f(x\ +\ i)\)
对于无法求点值的情况(多项式次数太高),要求\(n\)次差分的时候,\(f(x)\ =\ \sum_i\ a_i\ x^i\)不太好做,转化成\(f(x)\ =\ \sum_i\ b_i\ \binom{x}{i}\)就比较好差了
因为有\(\Delta^n\ f(x)\ =\ \sum_{i\ =\ 0}^d\ c_i\ \binom{x}{i\ -\ n}\)其中\(f(x)\ =\ \sum_{i\ =\ 0}^d\ c_i\ \binom{x}{i}\)
转化的时候可以用\(x^n\ =\ \sum_{k\ =\ 0}^n\ S2(n,\ k)\ (x)_k\),其中\(S2(n,\ k)\)为第二类斯特林数,\((x)_k\)表示\(x\)\(k\)次falling factorial
也有\((x)_n\ =\ \sum_{k\ =\ 0}^n\ S1(n,\ k)\ x^k\),其中\(S1(n,\ k)\)为带符号的第一类斯特林数

129

zzq题解
看了官方题解,感觉挺牛逼的啊,形如\(T(i,\ j)\ =\ \binom{i\ -\ 1\ }{j\ -\ 1\ }\cdot i\)这玩意儿是一个叫莱布尼兹调和三角形的玩意儿的倒数,莱布尼兹调和三角形有一个性质是\(A(i,\ j)\ =\ A(i\ +\ 1,\ j)\ +\ A(i\ +\ 1,\ j\ +\ 1)\),所以运用gcd的性质问题就变成了求\(lcm(N\ -\ K\ +\ 1,\ N\ -\ K\ +\ 2,\ ...,\ N)\),构造一个二维数组来维护\(\frac{ans_{n,\ k\ +\ 1}}{ans_{n,\ k}}\)

119

ARC062F

对于一个\(m\ >\ n\)的联通无向图,如果仅通过对一个简单环的边进行轮换,可以得到整个图所有的边的所有置换结果,证明可以考虑如何交换相邻两条边
要复习一波点双和polya
求点双可以在dfs(u)初始的时候stk[top++] = u
对于u的每一个dfs树中的孩子v判断是否low[v] >= dfn[u],如果是,就取出点双
取点双一定要注意是取到stk[top] == v为止,否则会wa
譬如如下的反例
1 2
2 3
3 4
4 1
2 5
5 6
6 2
以1为根,dfs(2)时,假设先访问3

110

sxbk卡常题啊, 直接求\(x^N\)TLE求\(x^{N\ mod\ \phi(M)}\)就A了
杨主力教了我一种用一个矩阵来维护每个表达式的方法,感觉非常牛逼啊

147

学了一波surreal number
在一般的博弈论题中都可以用: ${x\ |\ y}\ =\ z,\ x\ <\ z\ <\ y,\ \(且\)z$为最早出现的
然后发现题目出锅qaq,于是照着题解打了一遍,发现NOI2017D1T1都不会做,自己afo后水平下滑的太快,要是现在去考noi一道题都A不掉
感觉surreal number还是挺有趣的,以后可以学一学,打算把Knuth的小说给读了

ARC066F

非常巧妙的分治
考虑枚举选\(P_i\)的左端\(x\)和右端\(y\), 考虑分治做当\(l\ \leq\ x\ \leq\ y\ \leq\ r\)的时候的最大值

ARC083F

dag的拓扑排序数没有多项式时间做法

142

计算\([l,\ r]\)\(x\)的lca可以考虑将\([l,\ r]\)的点到根经过的边次数\(+1\),答案为\(x\)到根经过的每条边的次数*边权之和

106

\(ln(1\ -\ A(x))\ =\ \int\ \frac{-A'(x)}{1\ -\ A(x)}\ dx\ =\ -\int\ (\sum_{i\ \geq\ 0}\ A(x)^i)\ dA(x)\ =\ -\sum_{i\ \geq\ 1}\ \frac{A(x)^i}{i}\)
第二步可由\(\int\ f[g(x)]g'(x)dx\ =\ \int\ f[g(x)]dg(x)\)推导

105

第一次用向量乘优化矩阵乘法的技巧
注意可能会乘爆,所以要设\(\infty\)

139

结论猜不出啊qaq,图论题以后可以练一练

117

树上最长可以考虑成直径,点分之后相当于在新的虚树上的直径
只有加点的动态维护只需要维护直径两端就行了

154

简单数据结构题自己却不会做,好菜啊
对于二进制下做加法,可以建trie
如果根的左右儿子表示最高位,复杂度爆炸
表示最低位就只有\(O(\log\ val)\)
写trie或者其他数据结构的时候如果每次直接用node *u = new node会T,可以参考myy的代码,用一个pool存储

135

那么多人过的题,就我不会,水平垫底啊
观察\(F\)的性质可以发现如果知道了\(F(2i),\ F(2i\ +\ 1)\)可以推出\(F(i),\ F(i\ +\ 1)\),如果知道了\(F(2i\ -\ 1),\ F(2i)\)可以推出\(F(i\ -\ 1),\ F(i)\),那么枚举\(F(m\ -\ 1)\)即可

107

152

ARC081F

求一个矩阵最大全0子矩阵的方法是对每个点找到左侧和右侧都不低于它的最远位置,这种做法非常的妙

145

125

可以推出
\(ans\ =\ \sum_{d\ =\ 1}^N\ (2d\cdot f(\left \lfloor \frac{N}{d} \right \rfloor)\ +\ d\cdot \left \lfloor \frac{N}{d} \right \rfloor)\)
\(f(M)\ =\ \sum_{a\ =\ 1}^M\ \mu(d)\cdot d\cdot g(\left \lfloor \frac{M}{d^2} \right \rfloor)\)
\(g(T)\ =\ \sum_{a\ =\ 1}^{\sqrt{T}}\ a\ \sum_{b\ =\ 1}^{\sqrt{T}}\ \left \lfloor \frac{T}{a^2\ +\ b^2} \right \rfloor\)
这个时候发现\(\left \lfloor \frac{T}{a^2\ +\ b^2} \right \rfloor\)不太好处理,有个技巧是枚举\(k\ =\ a^2\ +\ b^2\)来做,将下取整拆成\(\sum_{k}\ 1\),有
\(g(T)\ =\ \sum_{k\ =\ 1}^T\ h(\left \lfloor \frac{T}{k} \right \rfloor)\)
\(h(S)\ =\ \sum_{a\ =\ 1}^{\sqrt{S}}\ a\ \sum_{b\ =\ 1}^{\sqrt{S}}\ [(a^2\ +\ b^2)\ \leq\ S]\ =\ \sum_{a\ =\ 1}^{\sqrt{S}}\ a\cdot \left \lfloor \sqrt{S\ -\ a^2} \right \rfloor\)
这样做可以拿到85分,复杂度\(O(n^{\frac{3}{4}})\)

可以发现不管怎么卷,卷多少次,\(f,\ g,\ h\)都有\(O(\sqrt{N})\)个值需要计算,所以复杂度均为\(O(\int_{1}^{\sqrt{N}}\ \sqrt{\left\lfloor\frac{N}{i}\right\rfloor})\ =\ O(\sqrt{N}\cdot i^{\frac{1}{2}}\vert_{1}^{\sqrt{N}})\ =\ O(N^{\frac{3}{4}})\)

主要复杂度在\(g\)上,考虑预处理\(g\)
\(h\)差分,令\(l(N)\ =\ h(N)\ -\ h(N\ -\ 1)\ =\ \sum_{a\ \geq\ 1}^{\sqrt{N}}\ a\cdot [(\left \lfloor \sqrt{N\ -\ a^2} \right \rfloor)^2\ +\ a^2\ =\ N^2]\)
则有\(g(N)\ =\ \sum_{i\ =\ 1}^N\ h(i)\cdot \left \lfloor \frac{N}{i} \right \rfloor\)
再对\(g\)差分,有\(g(N)\ -\ g(N\ -\ 1)\ =\ \sum_{d\ |\ N}\ l(d)\),就可以A掉了
由于这题有多个函数需要计算,因此需要能计算出每个函数大致需要的运算次数,去优化超过时限的函数的计算
在推倒中重复运用了差分和将下取整拆开的技巧

131

126

prufer编码后推出一个\(O(n^3)\)的dp式子
题解是拆开后分析每一个形如\(a_1\cdot a_2\cdot a_4\)的项的系数求和,用了这个式子,也可以强上GF

127

对于齐次线性递推\(h_n\ =\ \sum_{i\ =\ 1}^{k}\ a_i\cdot h_{n\ -\ i},\ a_k\ \neq\ 0\ \ \ (n\ \geq\ k)\),另\(q_1,\ q_2,\ q_3,\ ...,\ q_t\)为特征方程互异的根(特征方程为\(x^k\ -\ \sum_{i\ =\ 1}^k\ a_i\cdot x^{k\ -\ i}\ =\ 0\)),如果\(q_i\)\(s_i\)重根(重根的定义为有\(s_i\)个根为\(q_i\)),则另\(H_n^{(i)}\ =\ \sum_{j\ =\ 1}^{s_i}\ c_j\cdot n^{j\ -\ 1}\cdot q_i^n\),有\(h_n\ =\ \sum_{i\ =\ 1}^t\ H_n^{(i)}\)\(c_1,\ c_2,\ c_3,\ ...,\ c_n\)为需要求解的系数

114

一开始写用三模数ntt的时候傻逼了,CRT不能按照正常的方法做,而是要列方程解,因为模数不是选的三模数的乘积
对于任意模数fft通过myyfft比较快,写了个板子,以后可以用
在预处理\(\omega\)的时候注意要用\(cos(i\cdot \pi\ /\ hl)\),而不是一直从\(1\)每次成\(wn\),否则精度会炸

153

115

加0之后就要强行杜教筛,有毒吧...

128

需要复习一下线代相关的知识

148

发现当\(F(n)\ \neq\ n\)当且仅当\(n\)含有\(2,\ 3,\ 5,\ 7,\ 11\)中的质因数,直接dp即可
题解做法是设一个\(G(n)\ =\ \sum_{d\ |\ n}\ F(d)\cdot\mu (\frac{n}{d})\)
感觉自己根本不会数论啊,太菜了

140

有两种做法
做法一:
一个三个点的二叉树,一定要把根换到最小,那么对于6种大小关系(1表示最小、3表示最大):123->123,132->132,213->123,312->132,231->123或132,321->123或132。由于最后两种情况变出的两种情况都有可能是最有解的一部分,所以都要考虑,那么可以dpi,j,k表示第i个点的子树,如果根是j,下面为原样,最佳的方案中第k个数字是多少,每次dp直接暴力枚举转移并合并。可以证明这样是O(nlog2n)的:假设一共有k层,那么求和就是\(O(\sum_{i\ =\ 0}^k\ 2^i\ \times\ i\ \times\ 2^{k\ -\ i})\ =\ O(2^k\ \times\ k^2)\ =\ O(nlog_2n)\)
做法二:
考虑直接进行模拟,建一个数据结构维护有哪些边已经强制被选择,具体见代码吧

130

134

正解杜教筛,结果强上洲鸽筛被卡了一天的常才过qaq还有4k代码长度限制,真的sxbk
说一说洲鸽筛的一下卡常方法吧:
一些指针优化、去if和寄存器的方法就不说了。。。那个应该陶神最擅长啊orz
除法非常慢,尽可能的把除法删去,一个技巧是在枚举\([1,\ \sqrt{N}]\)的时候,\(/p_i\)的值可以通过暴力枚举
在算第二部分的dp值的时候暴力的做要枚举每一个\(\leq\ j\)\(p_i^c\),跑的时间大概是第一部分的三四倍,考虑优化掉这一部分
可以发现
\(dp(i,\ j)\ =\ dp(i\ +\ 1,\ j)\ +\ \sum_{c\ \geq\ 1}\ dp(i\ +\ 1,\ \left \lfloor \frac{j}{p_i^c} \right \rfloor)\cdot F(p_i^c)\)
\(dp(i,\ \left \lfloor \frac{j}{p_i} \right \rfloor)\ =\ \sum_{c\ \geq\ 1}\ dp(i\ +\ 1,\ \left \lfloor \frac{j}{p_i^c} \right \rfloor)\cdot F(p_i^{c\ -\ 1})\)
所以可得
\(dp(i,\ j)\ =\ dp(i\ +\ 1,\ j)\ +\ 2dp(i,\ \left \lfloor \frac{j}{p_i} \right \rfloor))\ -\ dp(i,\ \left \lfloor \frac{j}{p_i^2} \right \rfloor)\ +\ dp(i\ +\ 1,\ \left \lfloor \frac{j}{p_i} \right \rfloor)\)
这样可以多过一个点,还有两个点需要-1s超1s
因为还是做了2次除法
可以在算\(dp(i,\ j)\)的时候直接先将\(2dp(i,\ j)\ -\ dp(i\ +\ 1,\ j)\)算出
最后好像跑的比一些杜教筛快

正解里先简化\(\sigma0(n^2)\),然后变成要求\(\sum_{i\ =\ 1}^N\ \mu(i)^2\),这玩意儿可以理解为\([1,\ N]\)中的不含完全平方数为因子的数的个数,再通过意义转化

132

AGC015E

AGC008F

将每个可以产生的树,用直径的中心来表示,这个技巧在许多树计数问题都可以用,选重心用于子树大小相关,选中心经常用于直径相关

AGC011F

首先需要用数学式子来表示条件,表示的时候可以有个技巧,将第二辆火车的到达时间设为0
之后可得
\((A\ +\ x\ +\ a_i)\ mod\ L\ \leq\ (B\ -\ y\ -\ a_i)\ mod\ L\)
\((A\ +\ x)\ mod\ L\ \geq\ (B\ -\ y)\ mod\ L\)
移项后将\(x\)\(y\)放在一起
就变成了\(x\ +\ y\ \in\ [L,\ R]\)
这个通过贪心即可实现

AGC004E

AGC005E

AGC003F

AGC003E

答案就是\(i\ mod\ q_0,\ q_1,\ ...,\ q_m\)之后的和,一定要用multiset
一开始又想错了,wa了一发,还是应该think twice啊

AGC001D

AGC003D

题解有一个不用polard rho求将一个数补成完全立方数的算法。枚举\(\leq\ 1000\)的质数,\(>\ 1000\)的分类讨论即可。

AGC001E

一开始总是在想如何计算\(F(X,\ Y)\)(A的和为X, B的和为Y)的方案数,但是应该没有比fwt更优的做法了吧
题解是将最后的式子\(\sum_{i\ =\ 1}^n\ \sum_{j\ =\ 1}^n\ \binom{A_i\ +\ A_j\ +\ B_i\ +\ B_j}{A_i\ +\ A_j}\)的二项式系数在平面上表示,意义就是从\((-A_i,\ -B_i)\)\((A_j, B_j)\)的路径数

AGC019C

AGC017E

ARC082C

AGC017D

对于树上一些游戏的题目,可以考虑对于一个点,可以将它拆成每个子树的一个子游戏,这个点的游戏结果相当于所有子树的游戏结果的\(xor\)
如果只有一条边,可以通过数学归纳法证明
自己应该多练一练博弈论啊

ARC082D

AGC019F

打个表可以找到规律。。。这种方法就不多说了qaq
翻译一下tourist的题解吧:
首先可以将这种比较简单的dp转移变成每个点有权值,答案求从s到t点的路径期望数
发现对于一条\(i\ +\ j\)相同的对角线上,经过对角线所有点的总路径数就是s到t的总路径数,并且分母相同,所以按这种顺序考虑递推计算
如果相邻的两个点分子差为1,那么就需要统计经过这两个点边的路径数加到答案里去,这部分也可以通过按整条对角线递推计算

AGC010E

ARC072D

将每天放完水之后的dp值考虑上凸壳

ARC083C

AGC005D

AGC007C

自己根本不会概率和期望。
通过期望的线性性将答案拆成每一段上每个球滚过的概率,将dp式子写出来之后打表可以找到规律。
题解是每次模拟推一个球,计算之后每一步的期望。
这里讲一下余神犇教我的解法:
\(f_{l,\ r}\)表示一个线段,左侧是坑,右侧是球,左侧有\(l\)个球,右侧有\(r\)个球经过这个线段的期望球数
可以得到\(f_{l,\ r}\ =\ \frac{1}{2(l\ +\ r)}\ (2l\ *\ f_{l\ -\ 1,\ r}\ +\ (2r\ -\ 1)\ *\ f_{l,\ r\ -\ 1}\ +\ f_{r\ -\ 1,\ l}\ +\ 1)\)
这个没法优化,但是考虑答案要求的是\(\sum_{l\ +\ r\ =\ n}\ f_{l,\ r}\ *\ A\),其中可以发现对于\(f_{l,\ r}\)\(f_{r,\ l}\)\(A\)的和一定
所以可以通过沿对角线扫的方式来求答案

AGC007F

ARC071D

AGC010F

ARC077C

AGC010D

直接考虑原问题较为复杂,先分析奇偶性。
如果奇数个数\(>1\),那么每次操作之后奇偶性只有\(-1\)的数变。这时如果没有偶数,先手必败。
如果奇数个数\(=1\)要进行特判。

AGC011D

ARC065D

在看别人ac代码的时候发现了一个逼格挺高的一个取模写法, 感觉可以把妹子用啊

int F(int x) {
    return x -= mod, x + (x >> 31 & mod);
}

实测效率并没有提高多少
正确的原因是\(x >> 31\)高位用符号位补齐, 感觉初赛要gg啊

AGC016F

第一次做dp of dp,感觉真的是很有趣啊
首先可以发现\(sg(u,\ v)\ =\ sg(u)\ xor\ sg(v)\),然后问题就变成了求有多少个图\(sg(1)\ \neq\ sg(2)\)
这个时候可以通过sg值的定义来dp, 对于sg值为\(x\)的点,必须要与sg值为\(i\ (i\ \subseteq\ [0,\ x\ -\ 1])\)的集合中的至少一个点有边相连.
如果从\(n\)\(1\)定sg值的话,比较难dp
按照sg值大小进行dp即可

AGC016E

一开始总是想如果令i活下来的话,那么和i相邻的都会定下来,写dfs,但是遇到了一些比较难处理的问题。
比较优秀的处理方法是直接倒着沿\(m\)扫一遍,扫出来的都是必须要活着的,如果\(i\)\(j\)扫出来要活着的集合并为空,即为可行方案。
以前也遇到一些两维的题目,经常是沿着一维考虑非常难,换一维思考就比较简单,感觉这种题目还是要练啊。
高老师好像这类题目非常niubi, 经常做出来,实在是太劲了orz

AGC016B

AGC016C

AGC004D

AGC006C

\(x_i\)改为\(x_{i+1}\ +\ x_{i-1}\ -\ x_i\)时可以考虑差分

AGC014E

挺妙的一个题。一开始一直考虑如何维护出现两次的边,总在想一些高级数据结构。将操作从后往前考虑之后,可以发现如果合并两个点,那么直接启发式合并,把新出现的边扔一个队列里就行了,因为出现两次重复的边一定有新加的。

AGC012D

AGC012C

ARC063C

AGC007E

对于要维护最短直径的题目,可以先二分,这样可以省去维护内部最长长度的一维

AGC010C

AGC005F

考虑容斥完之后的式子\(f(k)\ =\ \sum_{u\ =\ 1}^n\ (\binom{n}{k}\ -\ \sum_{i\ =\ 1}^m\ \binom{size_i}{k})\ =\ \frac{1}{k!}(n\ \frac{n!}{(n\ -\ k)!}\ -\ \sum_{i\ =\ 1}^m\ \frac{a_i!}{(a_i\ -\ k)!})\), 就可以fft了,如果直接fft要注意要把数字控制在32768以内

AGC013C

AGC002F

将每种颜色第二个球按顺序确定之后,会有一些a在b后的限制条件,就考虑建出一个图求拓扑排序数

ARC073C

AGC015F

发现如果将询问Q(A, B)变成Q(B, B), 那么答案只有log级别, 所以先预处理出所有形如Q(A, A)的答案, 然后就直接暴力枚举下一步即可

ARC074C

AGC002E

我是直接用优化\(dp[i][k]\)表示,从小到大排序后,剩下\(a[1...i]\)没有被第一种操作删过,已经进行了\(k\)次第二种操作的胜负性
题解是把直接画出图之后把每次操作当成向上或者向右走,感觉差不多orz

AGC009D

感觉题解根本想不到啊qaq, 这种类似点分的问题要想到将所有点标号, 两个值相同的点路径中存在大于它们的点。然后考虑记录dp[u], u为根的子树内部仍然没有被消掉的点的mask, 可以发现这个mask是越小越好的,所以直接dp就行了orz

ARC072C

由于和终点距离单调不增,所以维护\([i...n]\)最小的不能达到的值即可

ARC068C

AGC006F

ARC077D

AGC004C

ARC080C

ARC002D

AGC009E

挺好玩的一个题,把merge过程想成在一棵树上进行合并,如果所有点的值都乘\(k^{dep}\), 那么构成的数就是所有填的地方的和。但是这样很难去重,所以考虑如果一个点的孩子填的都是同样的一个值(1或者0), 那么就把这个点填1, 删掉儿子, 这样一来,令\(o[1], o[2], ..., o[dep]\)为每层填的1的个数,发现是一个k进制数,显然就没有重复了。合法当且仅当最深一层两数之和为\(k\), 其余和均为\(k\ -\ 1\)。直接dp即可。这种题目都能先re一遍,感觉代码能力非常差啊qaq

AGC014D

对于博弈论的分析要转化成一个模型,譬如在此题中可以转化成匹配

ARC070D

AGC011C

AGC004F

先做了1500,感觉自己真菜。。。考虑问题可以转化为对于每一个点,记录在得到解得过程中颜色的变化,把所有点处于白色状态的作为一个图,处于黑色状态的作为另外一个图,那么合法的方案就是对于每个点白色图中的\(degree\)是黑色图中的\(degree+1\), 并且白色图和黑色图都可以得到完美匹配。
1500部分
由于是一颗树,那么是否可以完美匹配可以从叶节点贪心来做。如果想不清楚,实现起来挺复杂的。(至少对于我这种菜鸡是这样的。。。三行dfs写了2hr写不出,膜别人代码才懂qaq
对每个点记录一个值x, 如果这个点和父节点要在黑色图中匹配, 返回一个负值, 否则返回一个正的。abs(x)表示要和父节点匹配多少条边
上一波代码

int dfs(int u = 1, int p = 0) {
	int x = -1;
	for (int v: g[u]) {
		if(v != p) {
			x += dfs(v, u);
		}
	}
	ans += abs(x);
	return -x;
}

2200部分
由于\(m\ =\ n\), 所以只有一个环(连这个条件都看不到。。。别玩了。。。
如果是二分图,发现如果给黑色图中的匹配边和白色图中的匹配边定向的话,问题就转化成了在左侧每个点上有一个棋子,经过一系列移动使得右侧每个点上有一个棋子,问最少步数。(感觉题解这个转化真的很妙啊orz,题解的意思是如果考虑把二分图一侧的颜色反转,那么每次操作相当于把一条边左侧和右侧颜色交换
对于树中的部分,没有任何变化,接下来考虑环上的部分
环上每个点都有一个权值\(c[i]\)
如果是偶环,设有\(m\)个点,点\(m\)向点\(1\)连的边流量为\(x\), 答案就为\(\sum_{i\ =\ 1}^m\left | c[1]\ +\ c[2]\ +\ c[3]\ +\ ...\ +\ c[i]\ +\ x \right |\), 求最小值
如果是奇环,考虑将\((1,\ m)\)边删去。那么对于\((1,\ m)\)上的操作相当于给左侧和右侧同时增或减棋子,这个值可以计算出来,然后就变成了树上的问题了

ARC064D

AGC009C

ARC078C

AGC006D

ARC065C

傻屌题,居然写出了这种代码

for (auto x: ax) {
	sort(ALL(x));
}
for (auto x: ay) {
	sort(ALL(x));
}

AGC015D

AGC011E

\(111...11\)考虑成\(999...99\ /\ 9\ =\ (1000...00\ -\ 1)\ /\ 9\)

ARC078D

ARC068D

AGC018F

一开始想到先把每棵树所有点的子树和都变成-1,然后再建网络流看能不能得到,然后走上了不归路,感觉没法用网络流跑啊。。。
题解真的想不到。如果把所有x的值都确定在[-1,1]中,那么和的abs为1就变成了子树内x为奇数点需两两匹配,直接dfs即可

AGC018C

自己数据结构可真是菜。三维很明显不好搞,将\((A_i,\ B_i,\ C_i)\)变成\((A_i\ -\ C_i,\ B_i\ -\ C_i,\ 0)\)之后,只有两维了。
这时候有很多做法:
1.对于\(A_i\ -\ C_i\)排序,这样之后枚举\(K\), 前\(K\)个里面选\(X\)\(A\)\(K\ -\ X\)\(B\), 之后的\(N\ -\ K\)个选\(Y\ -\ K\ +\ X\)个B, 前半部分可以边扫边用heap维护,后半部分BIT维护即可(看了高老师的blog,发现做法和我差不多,可能是也算是他教我做题?但是自己和他还是有很大的差距啊
2.题解中关于\(A_i\ -\ B_i\)排序,这样选\(A\)的序号一定比选\(B\)的序号小(可以用贪心证明)
题解做法还是想不到,应该多练练数据结构维护方面的题目啊

AGC018B

一开始总想dp,后来发现如果每次删最大的才会变优,其实是个贪心。
应该加强贪心训练

AGC018D

挺喜欢的一个题,毕竟是和树相关的。
考虑如果将哈密尔顿路变成环,那么答案可以达到\(\sum_{i\ =\ 1}^n\ min(siz[i],\ n\ -\ siz[i])\),现在要删去环上的一条边。如果有一条边两侧子树大小相等,那么必须删去这条边,否则以重心为根dfs,如果割去的那条边经过点\(u\)\(par[u]\)的边,那么割去的总代价就为\(u\)\(centroid\)路径的边权和。

AGC006E

ARC080D

ARC075D

AGC008E

ARC079D

AGC019E

AGC013E

将平方转化为放两个球

AGC015C

ARC074D

AGC008D

AGC017F

ARC073D

AGC009B

ARC069D

AGC019D

AGC013D

ARC066C

ARC063D

AGC018E

注意到\(\sum_{i=0}^n\ \sum_{j=0}^m\ \binom{i+j}{i}\ =\ \binom{n+m+2}{n+1}\ -\ 1\),所以可以通过容斥的方法将问题转化成给定A和C两个点,中间有一个矩形B, B中选一个点P,从A到P到C的方案数
之后的部分可以通过类似AGC019F的方法沿\(x\ +\ y\)扫一遍,每次暴力转移边界即可
感觉自己推组合式好菜啊,大多数时候还是需要打表qaq

AGC012E

最裸的dp是\(dp[l][r][s]\)表示\([l,\ r]\)区间都遍历过,并且用了\(s\)集合里的数, 然后发现这样其实可以通过\(f[i][s]\)\(g[i][s]\)来表示,其中\(f[i][s]\)表示前缀\(i\)个用\(s\)集合里的数能否达成,\(g[i][s]\)表示后缀。由于存储的变量是bool,并且有单调性,考虑直接用\(f[s]\)表示用\(s\)可以达到的最长前缀,合并即可

AGC016D

用dsu实现更加便捷

AGC005C

ARC076C

ARC076D

ARC067D

posted @ 2017-10-17 12:19  King_George  阅读(2184)  评论(0)    收藏  举报