CSP-S联考总结

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

求满足一下条件的二叉树

  1. i号节点的儿子个数为\([l_i,r_i]\)
  2. i号节点的子树中至少有一个节点的编号大于i

考虑一种统计二叉树的DP,设\(f_{i,j,k}\)表示当前加到i号节点,形成j个连通块,还需要k个儿子的方案数

然后考虑枚举当前节点的儿子个数s,发现从前往后做要若\(s\ne0\)时要留下至少一个儿子(限制2)

  1. s=0:两种情况,单独成点,或者变成儿子
  2. s=1:与s=0相同,不过要钦定左右儿子,要乘2
  3. 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

?数学题

给出主视图,侧视图,求最少几个正方体

排序,直接贪,肯定同满足行列要求最好

posted @ 2024-02-25 09:54  zhy_learn  阅读(57)  评论(0)    收藏  举报