1001.Expression
记dp_{l,r}dpl,r表示l,rl,r这段数能造成的答案总和。php
枚举最后一步操做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),即把两边操做合起来的方案数。html
答案为dp_{1,n}dp1,n。express
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。markdown
这样能获得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。dom
使用优先队列维护这些数,每次删掉最大的两个,而后把他们的差插入到优先队列中,直到出现两个相同的数为止,而后还原方案。在随机数据的条件下是能跑得出解的。函数
感性认识一下,就是作完一轮后,大概每一个数的大小为原范围除掉25002500左右,这样几轮下来范围就变得很小了。spa
1003.GCD Tree
对于单组询问,考虑从大到小枚举公约数,假设当前是d,那么将d和它倍数之间连边便可,因此只要考虑(i,j)这样的边,其中j是i的倍数。code
对于多组数据,从1枚举到n,而后加入他向因子连的全部边,使用LCT维护最大生成树便可。htm
时间复杂度O(n\log^2n)O(nlog2n)。blog
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以上的那棵子树。