PB的一些神题(1)

首先ORZ PB优化

ARC068F

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

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

而后是考虑\([1,k-1]\)的方案数。能够发现code

  • \([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]\)游戏

后缀和优化便可get

代码it

AGC014D

首先 和你旁边的人 手玩一下样例和本身造的树io

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

而后你会发现,若是存在叶子节点,选它的父亲能够迫使后手选叶子节点,重复这个过程。

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

因而有结论:若是存在完美匹配,后手胜,不然先手胜。

代码

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\)取中位数便可

代码

相关文章
相关标签/搜索