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以上的那棵子樹。