PB的一些神题(1)

首先ORZ PB

ARC068F

考虑在k的位置把一个合法序列掰成两半:\([1,k-1]\)\([k+1,n]\)

先考虑摆\([k+1,n]\)的方案数,容易发现剩下的是一个单调队列,每次可以从头尾两端取。设\(A_i\)表示有\(i\)个元素的单调队列的取法,有\(A_0=A_1=1,A_i=2A_{i-1}(i\geq 2)\),显然这可以预处理

然后是考虑\([1,k-1]\)的方案数。可以发现

  • \([1,k-1]\)内的最小值要大于\([k+1,n]\)内的最大值(性质1)
  • \([1,k-1]\)由两个单调下降序列穿插而成,且有一个队列在\(k\)处结束(性质2)

\(f[i][j]\)表示填了\(i\)个数,最小值为\(j\)的方案数

考虑新加一个数\(k\),如果\(k<i\),那直接转移,否则只有当前没填过的最大的\(k\)能加入序列,否则会构成大于2个单调下降序列或者破坏性质2.

所以有\(f[i][j]=\sum\limits_{k>j} f[i][k]+f[i-1][j]\)

后缀和优化即可

代码

AGC014D

首先 和你旁边的人 手玩一下样例和自己造的树

然后你旁边的人就会骂你把必败态给他玩

然后你会发现,如果存在叶子节点,选它的父亲可以迫使后手选叶子节点,重复这个过程。

再想一下,如果把已经涂色的点删掉,这个过程就是贪心求完美匹配的过程。

于是有结论:如果存在完美匹配,后手胜,否则先手胜。

代码

AGC005F

一个取模引发的血案

这东西正着算很难算,考虑反着算 然后你就做完了

\(f_{x,k}\)表示选k个点组成的连通图中不包括x的方案数,易知这k个点都在x的子树中

所以\(f_{x,k}=C^n_k-\sum\limits_{u\in x} C^{sz_u}_k\),\(ans_k=\sum f_{x,k}=n*C^n_k-\sum\limits_x\sum\limits_{u\in x} C^{sz_u}_k\)

\(sz_u=i\)的个数为\(num_i\),则

\(ans_k=n*C^n_k-\sum\limits_{i=1}^{n-1} num_i*C^{i}_k\\=n*C^n_k-\sum\limits_{i=1}^{n-1} \frac{i!}{(i-k)!k!}\\=n*C^n_k-\frac{1}{k!}\sum\limits_{i=1}^{n-1} \frac{i!num_i}{(i-k)!}\)

\(A_i=num_i*i!\),\(B_i=\frac{1}{(n-i)!}\),这就是一个套路的NTT

代码

ARC082E

从原图中随便取一个凸多边形出来,设顶点点集为\(S\),凸多边形内(不含顶点)的点的集合为\(T\)

\(T\)的子集为\(T'\),则$ S\cup T'$有\(2^{|T|}\)种取法,即\(2^{|S\cup T|-|S|}\)种取法,是不是和原题求的东西很像呢?也就是说,一个存在凸包的点集对答案有1的贡献。

于是就枚算一下不存在凸包的点集,即全部点共线的点集的个数,直接暴力\(O(n^3)\)

代码

AGC010E

首先可以发现,不互质的数的相对位置不会改变。

然后你按字典序,对一个数\(x\),把它和尽量小的不和它互质的数连边(这个我不知道怎么讲清楚,看代码8……),然后你就得到了一堆拓扑图。把它们丢去拓扑排序,按照题意,每次一定会把当前最大的入度为0的点输出,用优先队列维护拓扑排序的过程即可。

代码

AGC010D

之前按奇数的个数讨论胜负,一看到题解"奇数个偶数"我就知道我想假乐

然后重新想

如果这个序列中如果存在1,把这个序列中(不为1的数-1)加起来,如果和为奇数先手胜,否则后手胜。

考虑先后手的一轮操作,在没有除法的情况下,可以保证奇/偶数个数的奇偶性不变,同样,在这个过程中,gcd为奇数,所以除法不影响奇/偶数个数的奇偶性。然后变到1就不能操作,偶数个数总体趋势还是减少的。当只剩一个偶数和一堆1时,根据上面的结论先手胜。所以有偶数个奇数时,先手必胜。

否则如果有偶数个偶数时,考虑游戏中任意一个局面,它的gcd为1,说明原序列中有\(\geq 1\)个奇数。也就是说,如果先手对偶数执行-1操作,gcd一直为奇数,除掉了以后奇偶数的个数不变,即变成了有奇数个偶数的情况,此时先手必败。那操作奇数呢?只剩下一个奇数时才能这么干,否则还是先手必败,理由同上。所以有偶数个偶数,且奇数个数\(> 1\)时,后手必胜,否则除掉gcd继续处理。

模拟一下就完了

代码

AGC008E

首先可以建一个\(i\rightarrow p_i\)的图,它显然会有很多个环。一个\(i\rightarrow a_i\)的图是由\(i\rightarrow p_i\)\(i\rightarrow p_{p_i}\)的边组成

然后考虑一个环在经过这样子变化后会变成怎样:

  • 全是\(i\rightarrow p_i\)的边

    和原图一样

  • 全是\(i\rightarrow p_{p_i}\)的边

    奇环没被拆掉,不过和原来的环长得不一样。

    偶环被拆成两个大小一样的环。

  • 两种边都有

    最后会形成环套树,且树是链的形态,一个环点只能挂一条链。

现在从\(i\rightarrow a_i\)反推会\(i\rightarrow p_i\)


  • 偶环和自环没变化,贡献为1

    奇环可以变得不一样也可以维持原样,贡献为2

    合并环,设合并\(2i\)个长为\(l\)的环。由于环的形态是固定的,所以合并两个环的方案数为\(l\) . 然后环对内的顺序和环对的相对顺序没有关系,所以最后方案数为\(\frac{l^i*(2i)!}{i!2^i}\)

  • 环套树
    设挂链的环点为关键点,链长为\(len\),一个点和它后边第一个关键点的距离为\(dis\)

    如果\(len<dis\),链的第一个点有两个地方塞,所以有两种塞法

    如果\(len=dis\),只有一种塞法

    否则没有塞法

加法/乘法原理统计一下就行了

代码

CF1217F

1操作map判断有无连边,2操作可撤销并查集维护

上面是假的,在线要写ETT,然而LOJ最短的ETT板子也有6k……

考虑\(lstans\)只有0和1两种取值,然后就可以把一个询问\(q_i\)拆成两个\(q_{i,1},q_{i,2}\),组成全局询问。对全局询问处理,处理出和下一个和\(q_{i,j}\)完全一样的询问出现的时间\(nxt\),则\(q_{i,j}\)这个询问存在的时间为\([i+1,nxt]\)。然后线段树分治+可撤销并查集进行处理。

处理方法:分治按时间分治。记上次的答案为\(lstans\),然后处理出真的询问/修改。如果是询问直接询问。如果是修改就拿个map记一下这个修改有没有被加过,没被加过就把这个修改对应的区间加上这条边,否则不加。

对于\(lstans\oplus 1\)对应的修改,也要判断是否可以加到线段树里进行加边,但是不哟用修改map!!

正确性嘛……没有涉及到的边会一直加,直到被涉及到……

代码

AGC036F

哎金华集训讲过来着?证明我在睡觉

这里意译翻译一个官方题解,感觉很妙:

考虑直接容斥:

求所有\(i\)满足\(p_i^2+i^2<(2n)^2+1\)的情况下,钦定\(k\)\(i\)满足\(p_i^2+i^2<n^2\)的方案数。设\(l_i\)表示满足\(x^2+i^2<n^2\)最大的\(x\)\(r_i\)表示满足\(x^2+i^2<(2n)^2+1\)最大的\(x\).令\(被钦定了没被钦定h_i=l_i(被钦定了)\;or\;r_i(没被钦定)\)。把\(h_i\)从小到大排序,则方案数为\(\prod\limits_{i=0}^{2n-1} (h_i-i)\)

然后你 就需要和出题人一样有强大的脑洞 要考虑一下\(h\)有什么限制:

\(l_i\)\(r_i\)划分成三个集合\(A\),\(B\),\(C\)

  • \(A=\{l_i|\;0\leq i\leq n-1\}\)
  • \(B=\{r_i|\;n\leq i\leq 2n-1\}\)
  • \(C=\{r_i|\;0\leq i\leq n-1\}\)

\(A\),\(B\),\(C\)里的元素分别为\(a\),\(b\),\(c\),把它们升序排序会发现所有的\(c\)\(a\)\(b\)的前面。

然后对于\(n\leq i\leq 2n-1\)\(h_i\)必须等于\(r_i\)。对于\(0\leq i \leq n-1\)\(h_i\)可以在\(l_i,r_i\)里选一个

先枚举选了多少个\(a\),然后考虑到\(i\)变大时\(l_i\)\(r_i\)都是递减的,且对于同一个\(i\)\(l_i<r_i\)。所以设\(dp[i][j]\)表示dp到第\(i\)个数,选了\(j\)\(a\). 先把所有的\(l,r\)排序,然后分类讨论这是\(a\)还是\(b\)还是\(c\),再记录一下填了有多少个\(b\)就可以\(O(1)\)确定一个数的位置啦,就完了8

代码

AGC004F

一题拖一星期我也真是厉害……

树是个二分图,于是把它黑白染色,设黑点权值为\(-1\),白点权值为\(1\),以\(x\)为根的子树和为\(f_x\)

则答案为\(\sum\limits_{i=1}^n |f_i|\)

我们把黑点看成洞,把白点看成球。这个式子就是让\(i\)子树内所有子树内所有的洞和球都匹配完。为了达成这目的,我们需要通过父边运一些球进来或运出去

奇环套树

设环边连接的两个点为\(u,v\)。因此\(u,v\)同色,就是我们操作一次,可以往\(u,v\)同时放下或同时拿出一个球,所以可以计算出操作\((u,v)\)的次数(即\(f_1/2\)),剩下的按树的做

偶环套树

此时\(u,v\)不同色,因此操作一次\(u\rightarrow v\)就相当于把\(u\)和它祖先的\(f\)\(+1\),把\(v\)和它祖先的\(f\)\(-1\)\(v\rightarrow u\)同理)

设操作\(u\rightarrow v\)\(x\)次(\(x<0\)即为操作\(v\rightarrow u\))

即要求\(\sum\limits_{x\in fa_u}|f_x-x|+\sum\limits_{y\in fa_v} |-f_y-x|\)的最小值

\(x\)取中位数即可

代码

猜你喜欢

转载自www.cnblogs.com/PsychicBoom/p/11791700.html
今日推荐