目录
2023.10.9
感觉还不在状态,被卡了一下常,加上没思路,加上部分分没怎么想,加上开错题,打得比较差
T1
打标找规律,然后\(\sqrt n\)做,但不能取mod,不然会TLE80,还要开int128
T2
奇怪结论
T3
优秀的计数题
给定一个序列a,要求找到序列x,满足\(x_i<a_i\and x_i\)mod\(l\)互不相同,求方案数
考试没仔细想,不然还比较可做
首先考虑对于\(l|a_i\)的情况,取任意数都是\(\frac{l}{a_i}\)中可能,所以一种排列的方案数就是\(\Pi\frac{l}{a_i}\)
然后考虑余数,我们考虑最简单的暴力,2^n枚举哪些取余数,那么考虑把余数b从小到大排序,第i个余数的取值就是\((b-i+1)\)
整理一下发现,一个数取余数,和下取整都有一个贡献,但取余数时的取值是固定的,取下取整时的取值只是固定mod的余数,于是考虑最后再把后面的贡献补回来,假如有k个取余数,那么就乘上\(A_{l-k}^{n-k}=\frac{(l-k)!}{(l-n)!}\)
然后就设\(f_{i,j}\)表示到第i个数,有j个取了余数,转移就是\(f_{i,j}=\lfloor\frac{l}{a_i}\rfloor f_{i-1,j}+(b_i-j+1)f_{i-1,j-1}\)
然后答案就是\(\sum\frac{(l-i)!}{(l-n)!}f_{n,i}\)
2023.10.11
T1
给一个每个点的度都小于三的点(有重边),黑白染色,要求相邻两条边所连接的三个点颜色不能全部相等,求染色方案
手摸一下,发现没有不合法,也没找到什么好做法,大概是调整法。然后仔细观察,我们令一条边的两个顶点颜色相同则权值为1,否则为0,如果最小化权值和,那么一定会更优,所以先全部先染黑,然后若有连续三个相同颜色,就调整一下,可以证明不会权值只会变小
T2
奇偶判断一下无解,然后就是简单的统计逆序对
T3
设n^4状态,然后n转移
T4
计数好题
给定一棵树,可以断任意条边,定义一种方案的代价为各连通块大小的k次方的和,求\(2^{n-1}\)种方案的代价和
首先考虑暴力,设\(g_{i,j}\)表示以i为根的子树,i所在的联通块大小为j的代价,j=0时表示断掉i的父亲那条边,然后为了方便转移,我们i所在连通块的代价先不算,每次更新完一棵子树,再进行更新\(g_{i,0}+=\sum g_{i,j}\times j^k\)
然后我们发现可以背包转移,时空复杂度\(O(n^2)\)
想到这里发现根本无法优化,于是就需要一点经验,发现\(k\le100\)
设\(f_{i,j}=\sum_{s=0}^{siz_i}(^s_j)f_{i,s}\),就是以i为根的子树,i所在的联通块贡献\((^s_j)\)的代价,我们发现,j的范围被缩减成k,然后根据第二类斯特林数的公式(普通幂转下降幂),\(s^k=\sum_{i=1}^ks2(k,i)i!(^s_i)\),然后令\(ans_i\)为该点断掉父亲的答案,\(ans_i\sum_{j=1}^ks2(k,j)j!f_{i,j}\)
发现了可以计算答案,那么如何转移呢?
考虑状态的组合意义,在连通块中取了j个点,由于子树中的情况互不影响,可以用乘法原理,于是又可以背包转移,注意ans要当作大小为0的物品转移
然后如果我们把背包大小定为\(min(k,siz_i)\),时间复杂度为\(O(nk)\)
2023.10.13
T1
数论分块+差分
T2
有长度为n的序列,m条限制,每条限制形如\(l,r,x\) ,要求区间\(l\sim r\)的and为\(x\),对于\(i\in[1,m]\),求满足除了i以外的全部限制是否有解
首先暴力,考虑拆位,对于每一位,0我们就做一次区间覆盖,1就查询区间是否有空位,复杂度\(O(mnlog)\)
我们发现删掉的区间若为1,直接判断即可,就考虑0的时候怎么做
我们想,删掉一个区间覆盖,只会改变若干只被覆盖一次的位置,于是我们把拎出来,然后把不合法的区间拎出来,若该删除区间包含的特殊点不能把全部不合法区间改合法,则不合法
于是就考虑只判断两边的,因为中间若存在我们已经提前判过了,会导致全部都不合法
所以只用记录左端点最大值和右端点最小值判断即可
T3
先缩点,再bfs跑最短路,再根据数据特性水一下
T4
奇怪背包结论
2023.10.14
T1
简单转化一下题意,求n个线性无关的数的方案数,然后DP即可
T2
给定一棵黑白染色的基环树,每个白点会给距离它最远的黑点们贡献1,求最后黑点的最大权值
首先可以想到n^2暴力,然后考虑优化
我们用线段树维护每个黑点距离当前点的距离的最大值,然后遍历一遍基环树,如果走的是树边,只有子树的距离-1,其他+1,如果走的是环,就个一半(判奇偶),然后发现dfn序即可
对于一个白点,就给打一个最大值对应位+1的标记,然后下传即可
2023.10.16
T1
二分+贪心/堆
T2
求满足一下条件的二叉树
- i号节点的儿子个数为\([l_i,r_i]\)
- i号节点的子树中至少有一个节点的编号大于i
考虑一种统计二叉树的DP,设\(f_{i,j,k}\)表示当前加到i号节点,形成j个连通块,还需要k个儿子的方案数
然后考虑枚举当前节点的儿子个数s,发现从前往后做要若\(s\ne0\)时要留下至少一个儿子(限制2)
- s=0:两种情况,单独成点,或者变成儿子
- s=1:与s=0相同,不过要钦定左右儿子,要乘2
- s=2:与s=0相同,还有两种特殊的,在某个儿子上接一个连通块,或向上接一个连通块再向下接一个
然后转移要注意记录方案数
2023.10.17
T1
发现状态数不多,然后直接全部跑处理,然后二维数点
T2
发现修改增加的值的情况只有\(\sqrt{修改次数}\)中,然后就可以打一棵线段树维护,然后每次遍历一边需要修改的点
T3
有一个01串,形如\(a_i\)个\(b_i\)接起来,有一个翻转操作,求至多翻转k次(\(k\in[0,m]\))的最长不下降子序列长度
我们先感性证明一下,对于01翻转,和序列翻转的贡献时一样的
定义简单01串为若干0+若干1
那么x个简单01串可以通过(x-1)次翻转操作归为一个简单01串,所以两个操作是等价的
首先考虑转换一下问题,先把1给选了(设有s1个),然后把0赋予1,1赋予-1,然后找到最大的权值t,容易发现lis长度为t+s1
然后我们要维护的就是就是翻转后的最大前缀和,假如我们已经处理好了一个最大前缀,然后考虑翻转1次后的最大值是什么?
我们发现,找到最大前缀后,然后找到一个最大子段和,如果在前缀中,就把它01翻转,如果在后面,就把如同红色区域翻转,都能记录它的贡献,而且是最优的
所以就转化了要求的东西,找到一个前缀和k段不交子段,使它们的和最大。然后每次贪心选最大子段,发现可能会相交,于是考虑反悔操作,每次取值最大子段,把它翻转,然后下次选时,如果相交,就等价于不选相交的部分
T4
给定序列a,序列p,在a中找到一个上升序列,下标为\(i_1,i_2...\),而且满足\(i_{j-2}\ne p_j\),求上升序列的最大长度
考虑朴素的n^2DP,就是对于普通的求lis的DP,每个\(f_i\)维护4个值,表示选了i为结尾的lis,最大值mx,前驱pre,次大值smx,前驱spre,然后考虑简单的转移,判断p和前驱的关系即可
然后如何优化呢,首先可以想到用a来维护一个前缀最值,然后发现原来实际上维护的二元组,最大值和前驱,还要加一维i,表示结尾,然后就变成三元组。转移的时候就把原来的结尾变成前驱
通过仔细推敲,我们发现维护5个最值即可完成转移,并且要保证5个最值中最多出现两个相同的前驱
为什么呢?
假如p判掉了两个前驱,我们还有3个最值,可以确保结尾至少有两种,也就是可以保证至少有两个新的前驱
然后每次再把两个前驱不同的丢进树状数组里即可
2023.10.19
信心赛...但只切两题...
T1
打标发现,只有x&y=0的二元组的贡献为\(lowbit(x\oplus y+1)\)
然后按位算贡献,或者数位DP
T2
结论题,nm-1
T3
原题链接https://www.luogu.com.cn/problem/P4643
考虑把一条边在两个顶点个挂一半,然后贪心选点即可,字典序最小方案数就双关键字排序
T4
?数学题
给出主视图,侧视图,求最少几个正方体
排序,直接贪,肯定同满足行列要求最好
标签:总结,2023.10,然后,CSP,前驱,余数,考虑,联考,翻转 From: https://www.cnblogs.com/zhy114514/p/18032079