arc121

没打,在军训

a:
黄吧,橙低了
我们按照x排序,那么可能成为次大值的是1和n,1和n-1,2和n,按照y同理。因为这些都是次大了,那么再取个max只会更大。然后把重复的判了,多写几个就可以。

b:
容易想到尽可能匹配多的偶。如果三组数是奇奇偶的话(为了方便称为123组),那么就是1和2匹或是1和3匹+2和3匹,对于第二种情况,如果1和3匹与2和3匹匹到了同一个那么显然可以12匹,所以不用特判这个情况。然后利用双指针来找第一个比自己大的数和第一个比自己小的数,对于找第一个比自己小的数我是将两个数组反一下了,当然这个用set也可以。

c:
容易想到冒泡排序,然后就没想出来。因为这是个排列,所以想着要将每个数都搞到对应的位置上,但如果一开始奇偶不对怎么办呢,我们显然要用掉奇数次操作,并且不影响到当前的位置。我们可以在这个数的后一位操作一下,如果涉及到已经排好的数那么就在前面操作。在操作到3时while搞就行了,对于n>=4的情况我们上面的方式显然是可以的。

d:
神经。考虑取一个数其实就是取这个数和0,然后取一个数的数量是0-n,那么就枚举加进0的数量,然后排个序。想让最大值-最小值最小,考虑一种a,b,c,d,(递增) 最大值只可能是ad,bd,cd,bc(一开始证的时候假设假错了)。那么bd,ac换成ad,bc肯定答案会更小,画图理解。cd,ab换成ad,bc肯定也会更好,然后就做完了

e:
因为要求的是一个排列与排列之间的映射,那么我们不妨将这个排列互换,那求的就是所有i,\(a_{i}\)不在i的子树内的方案。设\(dp_{u,i}\)代表在以u为根的子树内,有i个点的\(a_{i}\)不在自己子树内。那么可以利用树形背包来转移,然后计算u的贡献\(dp_{u,i}+=dp_{u,i-1}*(n-siz[u])\)

f:
树形dp场。
\(dp_{u,0/1}\)为以u为子树结果为0/1的方案数。考虑转移最后肯定是一个菊花的转移。考虑枚举最后转移的儿子。如果我们知道了\(dp_{u,1}\)那么\(dp_{u,0}\)减一下即可。只求\(dp_{u,1}\),那么如果这条边是and,那么其他边转移过来是1的方案乘\(dp_{to,1}\),如果是or,那么同理。如何求其他边转移,不会!全都想错了。
首先想看到计算合法的方案数,套路地先考虑如何判断一个方案是否合法。“至少若干个”等,见到此类计数应当迅速反应。由此也可能引出容斥

在列举了大量情况后,能够发现先操作所有 AND 边,后操作所有 OR 边,一定是不劣的。那么我们求的就是断开所有or边,只要有一个连通块是1,那么答案就是1。正难则反,求的就是所有连通块都是0的方案,而每个连通块只要有一个0即可。
\(dp_{u,0/1}\)为u所在的连通块结果为0/1的方案数枚举边。
先转移0,如果这条边断开那么必须从\(dp_{to,0}\)转移,\(dp_{u,0}=dp_{to,0}*dp_{u,0}\)
\(dp_{u,1}=dp_{to,0}*dp_{u,1}\)
如果不断开。
\(dp_{u,0}=dp_{to,0}*dp_{u,0}+dp_{to,1}*dp_{u,0}+dp_{to,0}*dp_{u,1}\)
\(dp_{u,1}=dp_{u,1}*dp_{to,1}\)

posted @ 2024-08-25 21:20  wuhupai  阅读(2)  评论(0编辑  收藏  举报