HUST-2015 Multi-University Training Contest 9
2015 Multi-University Training Contest 9 solutions BY xudyh
1001.Expression
记dp_{l,r}dpl,r表示l,rl,r这段数能形成的答案总和。
枚举最后一步操作kk,如果是乘法,答案为dp_{l,k}*dp_{k+1,r}dpl,k∗dpk+1,r,由于分配率这个会乘开来。如果是加法那么是dp_{l,r}*(r-k-1)!+dp_{k+1,r}*(k-l)!dpl,r∗(r−k−1)!+dpk+1,r∗(k−l)!,即要乘上右边k+1,rk+1,r这些数所有可行的方案数,减法同理。最后乘上{r-l-2 \choose k-l}(k−lr−l−2),即把两边操作合起来的方案数。
答案为dp_{1,n}dp1,n。
1002.Hack it!
首先我们将4个位置合并成一块,可以放"(())"或者"()()"。记这两个部分对应的权值分别为w_1,w_2w1,w2(对rr取模后),那么如果第一个串里放"(())",第二个串里放"()()",这样对答案f(a)-f(b)f(a)−f(b)的贡献是w_1-w_2w1−w2,否则对答案的贡献为00或者w_2-w_1w2−w1。
这样能得到25002500个块,假设每块的贡献值为c_1,c_2,\cdots,c_{2500}c1,c2,⋯,c2500。于是我们要构造d_1,d_2,\cdots,d_{2500}d1,d2,⋯,d2500,其中d_i\in {-1,0,1}di∈{−1,0,1},使得\sum_{i=1}^{2500} c_id_i=0∑i=12500cidi=0。
使用优先队列维护这些数,每次删掉最大的两个,然后把他们的差插入到优先队列中,直到出现两个相同的数为止,然后还原方案。在随机数据的条件下是能跑得出解的。
感性认识一下,就是做完一轮后,大概每个数的大小为原范围除掉25002500左右,这样几轮下来范围就变得很小了。
1003.GCD Tree
对于单组询问,考虑从大到小枚举公约数,假设当前是d,那么将d和它倍数之间连边即可,所以只要考虑(i,j)这样的边,其中j是i的倍数。
对于多组数据,从1枚举到n,然后加入他向因子连的所有边,使用LCT维护最大生成树即可。
时间复杂度O(n\log^2n)O(nlog2n)。
1004.Too Simple
首先要求每个f_ifi是个排列,否则如果某个f_ifi将两个数映射向同一个数,那么最后这两个数得到的值一定相同。
如果还剩一个位置为-1−1,那么这个排列是唯一确定的,假设X*f_i*Y=IX∗fi∗Y=I,那么f_i=X^{-1}*Y^{-1}fi=X−1∗Y−1.
所以假设有c(c\geq 1)c(c≥1)个-1−1,那么答案为(n!)^{c-1}(n!)c−1个可行的方案。
注意特判所有函数都已知的情况。
1005.Arithmetic Sequence
首先预处理出来出ii这个位置向前d_1d1的等差序列和向后d_2d2的等差数列能延续到多长,记作l_i,r_ili,ri。
如果d_1\neq d_2d1≠d2,那么枚举中间位置,答案为l_i*r_ili∗ri。
如果d_1=d_2d1=d2,枚举开始位置,答案为r_iri。
1006.Persistent Link/cut Tree
考虑爆搜,树ii生成后,两两点对路径分成两部分,一部分不经过中间的边,那么就是a_iai和b_ibi的答案,如果经过中间的边,首先计算中间这条边出现的次数,也就是a_i,b_iai,bi子树大小的乘积。对于a_iai,对答案的贡献为所有点到c_ici的距离和乘上b_ibi的子树大小。b_ibi同理。
那么转化为计算在树ii中,所有点到某个点jj的距离和。假设jj在a_iai内,那么就转化成了a_iai内jj这个点的距离总和加上b_ibi内所有点到d_idi的总和加上d_idi到jj的距离乘上子树b_ibi的大小,称作第一类询问。
这样就化成了在树ii中两个点jj和kk的距离,如果在同一棵子树中,可以递归下去,否则假设jj在a_iai中kk在b_ibi中,那么距离为jj到c_ici的距离加上kk到d_idi的距离加上l_ili,称作第二类询问。
然后对两类询问全都记忆化搜索即可。
接着考虑计算一下复杂度。
对于第二类询问,可以考虑询问的过程类似于线段树,只会有两个分支,中间的部分已经记忆化下来,不用再搜,时间复杂度O(m)O(m)。
我们分析一下复杂度,首先对于第一类询问,在b_ibi中到d_idi的点距离和已经由前面的询问得到,那么就转化为一个第一类询问和一个第二类询问,最多会被转化成O(m)O(m)个第二类询问。
所以每个询问复杂度是O(m^2)O(m2),总复杂度O(m^3)O(m3)。
1007.Travelling Salesman Problem
首先如果nn为奇数或者mm为奇数,那么显然可以遍历整个棋盘。
如果n,mn,m都为偶数,那么讲棋盘黑白染色,假设(1,1)(1,1)和(n,m)(n,m)都为黑色,那么这条路径中黑格个数比白格个数多11,而棋盘中黑白格子个数相同,所以必然有一个白格不会被经过,所以选择白格中权值最小的不经过。
构造方法是这样,首先RRRRDLLLLD这样的路径走到这个格子所在行或者上一行,然后DRUR这样走到这个格子的所在列或者前一列,然后绕过这个格子。然后走完这两行,接着按LLLLDRRRR这样的路径往下走。
1008.Goldbach's Conjecture
首先考虑一下如果一个数x=\prod_{i=1}^k p_i^{e_i},p_1<p_2<\cdots<p_kx=∏i=1kpiei,p1<p2<⋯<pk,那么充要条件就是每个p_i-1pi−1能被前面的一些因子表示出来,也就是p_i\leq d(\prod_{j=1}^{i-1}p_j^{e_j})+1pi≤d(∏j=1i−1pjej)+1。
可以直观理解一下,如果p_i-1pi−1不能被表示前面的因子出来肯定是不行的。否则这样一定能连续的表示出11到因子和的所有数,可以考虑类似p_ipi进制表示,c*p_i^kc∗pik前面的系数cc用那些小的因子去凑,这样就行了。
然后如果mm是好数,那么mn(1\leq n\leq 2m)mn(1≤n≤2m)也是好数,因为m-1m−1能用除了mm以外的因子拼出来,那么d(m)\geq m-1+m=2m-1d(m)≥m−1+m=2m−1,类似于上述的理由,mnmn也是好数。
如果mm和m+2m+2都是好数,那么m^2+2m2+2到3m^23m2之间的数能被表示成mx+(m+2)ymx+(m+2)y的形式,其中1\leq x\leq 2m,1\leq y\leq 2(m+2)1≤x≤2m,1≤y≤2(m+2),这个可以考虑线性不定方程的通解。
所以只要预处理出一系列mm和m+2m+2的好数,然后就可以将答案表示成mx+(m+2)ymx+(m+2)y的形式了,然后分解一下x,yx,y即可。
1009.Random Inversion Machine
这题改自去年鞍山赛区的Random Inversion Machine,去掉了每段分别排序这个条件,所以这题的做法复杂得多。
首先转化成,对于所有划分c_1,c_2,\cdots,c_lc1,c2,⋯,cl,枚举所有c_{i-1}\leq a_i<b_i\leq c_ici−1≤ai<bi≤ci,然后所有(a_i,b_i)(ai,bi)为逆序的概率。
比如k=3k=3,划分成了[1,3],[4,6][1,3],[4,6],假设X_{i,j}Xi,j为i,ji,j为逆序对的随机变量,那么E((X_{1,2}+X_{1,3}+X_{2,3})(X_{4,5}+X_{4,6}+X_{5,6}))E((X1,2+X1,3+X2,3)(X4,5+X4,6+X5,6)),这个东西可以展开。比如其中某项E(X_{1,2}X_{4,5})E(X1,2X4,5),那么就相当于1,21,2为逆序对4,54,5为逆序对的概率。
然后用有向边表示大小关系,如果ii连向jj,那么代表有ii位置的数小于jj位置的数。那么一开始给定的限制p_1,p_2,\cdots,p_mp1,p2,⋯,pm形成了一条链,称为主链。
对于前面算某些位置为逆序对的概率,相当于多加了很多限制,也就是连了很多额外的边。概率就为给这个图上面的点随机标号,然后大小关系满足边的指向的概率。
考虑每段选的两个数,如果都在主链上,那么一定无解,因为不可能为逆序对。如果都不在主链上,那么概率为1/21/2。否则就会有一条边连入或者连出主链。
如果所有边都连入主链,那么整个图就形成了有根树的结构,这样的图的概率为每个点子树大小乘积的倒数,因为每个点都要在子树里最小。
对于连出主链的边,可以这样转化不连这条边形成的图对应的概率减去将这条边反向之后图对应的概率。因为两个数a,ba,b只可能a<ba<b或者a>ba>b,那么把和将这条边反向之后的概率加起来后,两个点之间就没有限制了。
我们可以使用dpdp来做上述过程,dp_{i,j,k}dpi,j,k表示前ii个数,划分成jj段,然后主链上连入了kk条边,转移的时候枚举当前一段的右端点rr,然后枚举这一段里面选了那两个数,然后按照前面所讲的概率分别转移。对于连出去的边,按不加这条边的概率转移向dp_{r,j+1,k}dpr,j+1,k,将这条边取反后的概率乘上-1−1转移向dp_{r,j+1,k+1}dpr,j+1,k+1。因为知道多少个点连入了主链,所以可以知道每个主链上的数对应的概率。
然后如果l,r,kl,r,k确定了,每段转移的概率可以预处理出来。
总复杂度O(n^4)O(n4)。
1010.Sometimes Naive
对于询问u,vu,v,相当于权值总和的平方减去将u,vu,v这条链包括上面的点去掉后形成的各个子树权值和的平方。
使用树链剖分,然后维护一下每个点轻链儿子的子树权值和的平方即可。
修改操作时,每次从一条重链跳到另一条重链时,修改一下跳进去那个点的权值和。
查询操作时,如果在同一条重链上用线段树可以解决,注意不同重链之间不要重复计算即可。最后加上LCA以上的那棵子树。