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实现更加便捷

浙公网安备 33010602011771号