2021.4.27
模拟赛:
t1赛时想到了莫反和枚举质因数达到上界集合两种做法。但是关于“有序”“无序”的东西弄蒙了。
赛时是一开始想枚举最后一个环,然后转移系数是\(C(i,j)*(i-j-1)!\),但是又发现这东西\((1 2)(3 4)\)之间是无序的,我就还得计算同样大小环的个数除掉阶乘,所以复杂度多个\(n\)原地爆炸。
原来skyh其实给我讲过这东西,就是钦定最后一个数在最后一个环里,也就是转移系数是\(C(i-1,j-1)\),从前\(i-1\)个数里选出\(j-1\)个和\(n\)同环。别的无所谓了。
t2还是经典套路,直接用一个数组维护Trie树的后缀和,用分块把区间转全局。
t3
1.考虑这个序列用一个\(c_i\)覆盖一段后缀,首先有性质它覆盖的位置之前的决策点一定不变,因为后面怎么样和前面完全无关。
2.发现每个数的价值是一个关于\(c_i\)的开口向上的二次函数。那么一定不存在一个点使得\(c_{i-1}\)比\(c_i\)优,且\(c_{i+1}\)比\(c_i\)优,这和开口向上矛盾。
所以如果有一个区间覆盖的区间超过了上个区间,考虑左端点的贡献,向右移一位一定更优。
那么就直接基于这个做就好了。
oyyp:
定期重构。如果修改对查询的贡献可以\(O(1)\)计算,那就定期重构,复杂度只和预处理复杂度和单次查询复杂度有关。
给定\(n\times n\)矩阵,求面积比周长最大值。
显然可以二分+分数规划直接\(O(n^3\log n)\)。发现很多二分没有用,可以先随机枚举上下边界,再首先判断是否可以得到最大值,如果得不到直接退出。这样二分次数期望\(n^2\ln n\),复杂度就\(O(n^3+n^2\log^2 n)\)
切奶酪题,考虑比值是不变的,变成截矩形堆起来。
初始\(x=0\),随机进行操作给他做一次函数变换。求期望。
就考虑由某个\(b_i\)和众多\(k_j\)组合出来一项贡献。就直接枚举一个集合,令他在\(i\)后面。
这东西就可以分治NTT,记两个多项式表示是否存在特殊的\(b_i\),恰好存在一个特殊或者不存在都算出来。
长度为\(n\)序列,翻转一段区间,代价为区间长度
考虑只和大小有关,转成01。这套路都见过一万遍了,哪次你记住了?
01序列排序可以\(O(n\log n)\)递归做。这个相当于把小于\(mid\)放左边,大于放右边,相当于01序列排序。所以直接做一次,代价为\(T(n)=2T(\frac{n}{2})+O(n\log n)\),\(T(n)=O(n\log^2 n)\)
多次询问区间\([l,r]\)不能组合出来的最小数。
考虑全局做就是排序,依次往后加。如果当前加进去的\(x\)大于当前总和\(S\),那\(S+1\)你搞不出来。否则一定能搞出来,往里加就完了。
一个优化就是每次把所有小于等于\(S\)的都加进去。那么这样令第\(i\)次加入后的总和为\(S_i\),那么一定有\(S_{i+1}=S_i+\sum\limits_{x>S_{i-1}}x\),增长速度一定比斐波那契数列快。
首都建边必定链最优神题回头再说
给一棵树,随机断边,求每个联通块最大值的最小值的期望。
好几个题的经典套路,一个都想不到,白学了/px
首先,直接枚举每个点成为最小值的概率。至少这个我想到了,还行。
然后一个点成为最小值的概率可以差分为\(P(ans\geq a_i)-P(ans\geq a_i+1)\),直接求\(P(ans\geq x)\)即可。
这东西的优势就是说每个联通块只要有一个大于等于\(x\)的点就说明他合法。否则就不合法。
而且只要每个联通块都合法,就能说明整棵树都合法。
那么就直接做个简单dp就行了,对每个点求就简单动态dp。
ARC083F
神仙题啊,不过可能很套路。
首先发现这个东西一定是一个机器人对一个球。那么对于某种合法分配方式,可以计算它的合法方案。
鬼知道咋想到的机器人当成点,球当成边(可能是想二分图?二维平面好像全是二分图),合法分配方案一定是,每个连通块是一个基环树。
那么每个连通块合法分配方案就一定有两种。对于一种分配方案,考虑它需要满足什么,就是一个点分配的边假如是\((x,y)\),那么所有\((t,x)\)的边一定不能阻挡\((x,y)\),所以如果存在\(t<y\)的话,\(t\)一定比\(x\)先匹配掉。
那么发现这种拓扑序限制一定是原树的子图。而且也一定不会出现环。那么就按照这种拓扑序形成的森林上做dp即可。
初始\(n,m\)滴血,互相砍,有概率中,获胜概率。
就直接\(f_{x,y}\)表示\(A\)剩\(x\)血,\(B\)剩\(y\)血,转移就往\((x-1,y),(x,y-1),(x-1,y-1)\)。边界是\(f_{i,0}=f_{0,0}=1,f_{0,i}=0\)
等价于有3种走法,右走上走右上走,枚举右上个数就能\(O(n)\)了