1. 程式人生 > >Team 馬上就要被樓下超過了 訓練記錄

Team 馬上就要被樓下超過了 訓練記錄

Team members

BiuBiuBiu
Walker
Forever_Cloud

To Do List

Team 解散啦!

Caution

博弈題或者數學題遇事不決上來先打表
輸出字元大小寫檢驗
題意必須完全讀懂再上去寫程式碼
其他人有思路的程式碼ffx完成程式碼後應該讓有思路的那個人檢查

Contest


A Fried Fish (簽到) 84 / 304
B Hanoi tower (推公式) 12 / 48(賽後過掉)
C Desktop (構造) 16 / 71 (賽後過掉)
D Weather Station (簽到) 66 / 104


E Cupcakes (推公式) 24 / 99
F Vitamins (並查集暴力) 12 / 47(賽後過掉)
G Sphenic numbers(簽到) 82 / 270
H Non-random numbers(腦洞題) 69 / 100
I Land Division 4 / 19
J Architect of Your Own Fortune(二分圖) 31 / 67
K Polymorphic code 0/0

過程:開局由於ffx不知道cf需要檔案讀入wa1很久,後來發現了交了A,又wa了,有個小細節沒改改了就過了
這個時候ffx也碼完了DG,G交上去1A了,Dwa3,wk看程式碼發現少個細節,加了就過了,這個時候sbw說了一下h的題意,ffx發現大於10直接加0,於是寫了個暴力0-9就1A了,這個時候sbw推出了B的公式(但是後來發現是錯的),由於需要高精度,ffx掏出java寫完發現不會檔案讀入,這個時候wk發現J是個很sb的二分圖,於是ffx建圖,wk寫了個二分圖就合力把J過了,之後全體看E,ffx猜了一下需要分成兩股力量去討論,然後wk和sbw分別推出做法,由於ffx數學sb就去看c了,wk上機敲了一下wa1,後來發現是(yes大小寫的問題,不然是wa12),最後ffx敲了sbw的思路,wa3了,後來發現是有個小地方著急寫錯了,改了就過了,於是這場就結束了。
題解


ADGH:sb題
B:需要理解題意是要在完整的漢諾塔移動過程中尋找3柱數目相等的第一個狀態,然後理解一下漢諾塔移動的規則,分奇偶看一下發現在偶數的時候第一個相等的狀態是先移動(2/3)n-1片到一個柱子B上,然後移動第2/3n片到C柱,接著把B柱上面的1/3*n-1片移動過去就可以了,奇數的時候第一個相等的狀態是先移動(2/3)n-1片到B柱子上,然後移動第2/3n片到C柱,然後將B柱最上方的(1/3)n片移動到C柱上(這裡需要都多移動一個棋子,因為所求是在移動整個漢諾塔的過程中出現各柱相同的情況。舉例子總共有9片,當移動完前5片在b柱上之後,將第六片移動到c柱,此時移動b柱上的片,正常情況下不會出現1,2片出現在c柱的情況,而是1,2片在a柱上,3在c柱上,所以必須移動b柱上的1,2,3個片才會出現2,3片在c柱上,1片在b柱上,此時各個柱子都是有3個)
https://paste.ubuntu.com/p/f2fdqZNQRP/

C:分奇偶情況討論,將奇數情況轉化為偶數情況,這類題都要想出一個肯定正確的狀態,然後把不確定的狀態轉換為這個肯定正確的狀態
https://paste.ubuntu.com/p/SXqVdhTZKT/
E:一個類似博弈的推公式,分別計算每一段必勝態存在區間的最小值和最大值,然後判斷給定的蛋糕數是不是在段必勝態之間即可
https://paste.ubuntu.com/p/ctqxgFbB5M/
F:並查集加暴力列舉;因為只有1000個點可以用n^2的演算法過題。因為會有=號的存在,所以會有一種情況1>2,3>4,2=3.這種情況下,必須要將2,3合併在一起才能知道所有點的關係。而將所有同層次的點連線在一起的一個方法就是並查集,所以首先掃描所有的邊將=號相連的兩個點放入並查集中,然後再掃描一遍所有邊,將此邊連線在兩個端點的祖先節點上,這樣就能將分散的邊集中在一起。然後掃描一遍所有點,將有父節點,且有根節點的點的祖先節點的等級標記為1,然後將兒子節點的祖先節點等級標記為2,同理父親為0.最後再掃描一邊所有點,看本店的祖先節點的等級是什麼,然後由等級輸出wrs,0對應w。
https://paste.ubuntu.com/p/mpqW59jMkR/
J:一個裸的二分圖,首先將所有車票記錄下來,然後A車票的前三位記錄為num1[i][0],後三位為num1[i][1],T車票同樣記錄下來,然後n^2掃點,如果a車票的前三位等於t車票的後三位,t車票的前三位等於a車票的後三位,這樣就將i向j連邊,這樣圖建好後,跑一邊匈牙利演算法,就能得到最大匹配,然後根據linker[v](t車票跟哪個a車票相連),輸出相應的兩個車票序號。
https://paste.ubuntu.com/p/ZShYwk7zSC/


A UVALive 7723 Wrestling Match(帶權並查集) 325 / 1045
B UVALive 7724 Regular Number(shift-and演算法) 34 / 296(賽後過掉)
C UVALive 7725 Game of Taking Stones(java二分) 65 / 328(賽後過掉)
D UVALive 7726 A Simple Math Problem(推公式) 363 / 1339
E UVALive 7727 Aninteresting game(樹狀陣列原理考察) 51 / 196(賽後過掉)
F UVALive 7728 Detachment (推公式) ** 242 / 878 **
G UVALive 7729 Garden of Eden(點分治) ** 82 / 304**(賽後過掉)
H UVALive 7730 To begin or not to begin(簽到) **487 / 739 **
I UVALive 7731 Convex(簽到)483 / 653
J UVALive 7732 Find Small A(簽到) 479 / 952
K UVALive 7733 Guess the number 31 / 117
**過程:**這場打的很坎坷,因為前期A了HI之後一直卡在J題,由於想投機取巧導致位運算出錯,卡了特別久之後才過掉,過一會wk和ffx推出了D的正解,但是一直wa,後來試了一下交換兩個數的輸出順序,就過了,感覺現場賽應該會說明這點,題面真的沒有說!之後wk發現A是一個並查集,於是上機敲,ffx和sbw搞F,sbw發現可以轉換為一段一段的操作來做,於是兩個人分別推出了公式,這時候wk由於有個題意沒太讀懂wa了一發A,在wk找bug的過程中,ffx上去敲了F,1A了,下來之後又讀了一遍A,發現有一個地方可以理解成兩種題意,於是wk按照第二種題意加了特判,就把A過掉了,之後開G,由於兩個人都沒怎麼寫過兩邊樹形dp的這種題,GG了
題解:
HIJ:sb題(J題注意2^8=256 ==||)
A:帶權並查集
因為本題目只有兩種狀態,不是好就是壞。所以總的狀態就只有0,1兩種。
find函式回溯的時候sum[x]=(sum[x]+sum[t])%2,t是x的初始祖先節點;
在加入並查集時,fx=find
(x),fy=find_(y),當fx!=fy時sum[fy]=(sum[x]-sum[y]+1+2)%2;
當相同時需要判斷是否符合sum[x]!=sum[y],不符合說明有陣營不明確的人
另外本題還有一個注意點,有些並查集只有自己一個節點,這種情況下也是
不明確的人,所以需要用cnt陣列記錄每個並查集中節點數目。
最後一個注意點,有可能是加入並查集沒有錯誤,但是最後可能一個並查集中
有些點在好的陣營中,另外在壞的陣營中,需要將這種情況排除掉
https://paste.ubuntu.com/p/rBtqr2JWD7/
G:點分治演算法
問你有多少對(u,v),使得在此路徑上的種類數有k個
點分治就是基於樹上的節點進行分治。
點分治的本質其實是將一棵樹拆分成許多棵子樹處理,並不斷進行。
這其中有兩個部分是不變的,一個是計算重心,一個是對子樹進行路徑的計算或者記錄狀態
剩下的就是在總的dfs下,計算通過當前根節點的路徑上的資訊(一般計數題目是總體計算然後剪去合併的衝突項,有些問滿足條件的最長路徑是遍歷過程中不斷尋找最大值)
本題目一個注意點就是在計算當前子樹的滿足條件的路徑數時,為了降低複雜度
用下面這種方式,其實s0=(s0-1)&sta[i],這個操作可以實現對sta[i]的1的遍歷
比如與10010或等於11111的最小的數時1101,然後是1111,之後是11101,最後是11111
實際模擬一遍就知道怎麼回事了
https://paste.ubuntu.com/p/2dxdYph2zX/

for(int s0=sta[i];s0;s0=(s0-1)&sta[i])  res+=cou[((1<<k)-1)^s0];

D:推公式
題目給出兩個等式:
X+Y=AX+Y=A
LCM(X,Y)=BLCM(X,Y)=B
我們可以看出A,B的GCD也就是X,Y的GCD
我們首先讓兩個等式同時除以GCD(A,B)GCD(A,B)
便得到:
X1+Y1=A/GCD(A,B)X1+Y1=A/GCD(A,B)
X1Y1=B/GCD(A,B)X1*Y1=B/GCD(A,B)
X1GCD(A,B)=X,Y1GCD(A,B)=YX1*GCD(A,B)=X,Y1*GCD(A,B)=Y
解方程求出X1,Y1,乘以GCD(A,B)即可
https://paste.ubuntu.com/p/3CJP22CBt8/
C.高精度
威佐夫博弈只要滿足
(5+1)2(MaxMin)=Min \frac{\left( \sqrt{5}+1 \right)}{2}*\left( Max-Min \right) =Min
所以只要大數+java二分高精度求出5\sqrt{5}就可以了。
https://paste.ubuntu.com/p/twsbyFXPJT/
E.樹狀陣列
首先我們要深刻理解樹狀陣列的內部原理
我們先來看一下每個數的二進位制碼和它們對應的lowbit
樹狀陣列原理
1.lowbit(i)表示i能整除的最大的2的冪次
2.i-lowbit(i)表示跳到前一個整冪次的二進位制區間
3.i+lowbit(i)表示跳到下一個包含當前區間的區間
如果知道這三個性質,
我們先來看第一問,求某兩段之間的lowbit之和,
我們首先求出sum(1,i1)sum(1,i-1)再求出sum(1,j)sum(1,j),字首和相減就可以了
現在問題變為如何求出sum(1n)sum(1-n),我們來看性質1,我們發現我們只要知道
有多少恰好只能整除1的
有多少恰好只能整除2的
有多少恰好只能整除4的…
我們可以發現恰好整除1個數為[n/1n/2][n/1-n/2]向下取整
因為能夠整除1的只包含恰好整除1的和能夠整除2的
以此類推,我們就可以o(1)的計算出所有2的冪次的貢獻,之後就掃一遍算貢獻就可以了
單次複雜度是log的
再來看第二問,問某個數被加過幾次,想想樹狀陣列的add函式,這個問題就不難想了,每個數字只會在包含他的區間被重新新增,我們只要觀察性質三,就很容易算出第二問了!於是整個題就解決了。
https://paste.ubuntu.com/p/dTQsG8mfNh/
F.推公式
本題題意就是讓一個數拆成多個數之和,而且這些數的乘積最大,我們知道當我們拆的數越多,乘積就越大,然題意要求每個數不重複,所以我們要讓這些數儘量靠近,分下面兩種情況
1.X=Σi=2niX=9=2+3+4.2i,1. X=\varSigma _{i=2}^{n}i 例如X=9=2+3+4.此時肯定拆分為2-i,為最大飽和狀態
2.X=Σi=2ni+k(k&lt;=n)Kn2+1 2.X=\varSigma _{i=2}^{n}i+k\left( k&lt;=n \right) 對於多出來的K,我們能想到肯定是從n到2每個不斷+1,這樣才能保證這些數足夠靠近。
根據以上兩種情況我們列出等式
X=(2+n)(n1)2nnk(n+1)(n+0)...(nk+2)(nk)(nk1)...1 X=\frac{\left( 2+n \right) *\left( n-1 \right)}{2} n在這裡代表長度 解出n之後算出k,答案就是(n+1)*(n+0)*...*(n-k+2)*(n-k)*(n-k-1)*...*1 答案用兩個階層相除表示就可以了。
https://paste.ubuntu.com/p/PbSbmttPMK/
B.Shift-And演算法
l如果你學過這個演算法的話,那麼就是模板題。
Shift-And演算法解決的就是每個位置可以放很多種字元時的字串匹配問題
ans陣列表示的是有哪些長度即是目標串字尾又是模式串字首
求模式串在目標串中出現次數的時候
例如11001就代表當前串有長度為1,4,5的串既是目標串字尾又是模式串字首
所以如果我們想統計模式串出現次數,就是ans[len]=1時答案++;
所以這道題就可以用Shift-And演算法結束了!
https://paste.ubuntu.com/p/5S6RNvSvYG/


A HDU 5948 Thickest Burger(簽到) 196 / 206
B HDU 5949 Relative atomic mass(簽到) 195 / 197
C HDU 5950 Recursive sequence(矩陣快速冪) 138 / 376
D HDU 5951 Winning an Auction 0 / 33
E HDU 5952 Counting Cliques(DFS) 118 / 602(賽後過掉)
F HDU 5953 Similar Rotations 0 / 1
G HDU 5954 Do not pour out 19 / 216
H HDU 5955 Guessing the Dice Roll(AC自動機+高斯消元+概率DP) 46 / 227(待補)
I HDU 5956 The Elder 29 / 191
J HDU 5957 Query on a graph 8 / 36
K HDU 5958 New Signal Decomposition 0 / 2
L HDU 5959 A Random Turn Connection Game 0 / 1
M HDU 5960 Subsequence 1 / 5
過程
這場算是隊伍訓練掛機時間最長的場,開場由於AB都是c語言題ffx就直接1A了,然後wk推出了B的轉移公式,ffx開始敲矩陣快速冪,由於板子錯了!!!導致卡了將近半個小時,過了C之後ffx想寫一發E的dfs暴力,wk感覺E可以bitset搞一下,由於ffx覺得自己的dfs跑的肯定很慢所以就放棄,讓wk上去敲,敲好之後發現bitset的做法處理不了某些情況是錯的,那時候時間已經剩的不多了,ffx上去敲自己的dfs也TLE了,於是這場就GG了,感覺以後還是要做法確定再上去敲,不然可能導致時間浪費過多。
題解
AB:SB題
C.矩陣快速冪
根據提議我們知道轉移矩陣為
f[i]=2f[i2]+f[i1]+i4f[i]=2*f[i-2]+f[i-1]+i^4
前兩項很容易通過矩陣快速冪轉移,而後面就很麻煩,所以我們要看$i^4是否可以轉移

i4=(i1)4+4(i1)3+6(i1)2+4(i1)1+1 i^4=\left( i-1 \right) ^4+4*\left( i-1 \right) ^3+6*\left( i-1 \right) ^2+4*\left( i-1 \right) ^1+1

i3=(i1)3+3(i1)2+3(i1)1+1 i^3=\left( i-1 \right) ^3+3*\left( i-1 \right) ^2+3*\left( i-1 \right) ^1+1

i2=(i1)2+2(i1)1+1 i^2=\left( i-1 \right) ^2+2\left( i-1 \right) ^1+1
所以我們只要在轉移矩陣中將i4,i3,i2,i,1i^4,i^3,i^2,i,1也一起轉移就可以了
具體轉移矩陣如下這裡寫圖片描述
https://paste.ubuntu.com/p/ybcmW4kDPn/
D.dfs
這道題由於資料量只有100,所以可以大力爆搜,對每個點去搜一下這個點能構成的完全圖數量,搜尋的時侯有一個當前點集,如果這個點能到達的點與當前點集內部的點都有邊,那麼就將下個點放入點集從下個點繼續搜下去,當點集內的點數量等於k,則更新答案,但是這樣搜尋我們發現每種完全圖都被重複搜尋了k!次,為了避免這種情況,我們可以將無向圖建為有向圖,這樣只要沿著有向圖跑,每種完全圖最多被統計一次,這就是無向圖統計某種圖時建立單向邊從而減少多次統計一個圖的情況。
https://paste.ubuntu.com/p/ngQGzygRMC/


A HDU 5933 ArcSoft’s Office Rearrangement(模擬題) **163 / 509 **
B HDU 5934 Bomb(tarjan) **112 / 375 **
C HDU 5935 Car(貪心) **156 / 660 **
D HDU 5936 Difference(折半暴力) **37 / 304 **(賽後過掉)
E HDU 5937 Equation(dfs) **25 / 64 ** (賽後過掉)
F HDU 5938 Four Operations(貪心) **171 / 513 **
G HDU 5939 Game of Eliminate **4 / 62 **
H HDU 5940 Hazy String **0 / 3 **
I HDU 5941 Inequality **3 / 39 **
J HDU 5942 Just a Math Problem **7 / 23 **
K HDU 5943 Kingdom of Obsession(二分圖) **72 / 776 **
過程
這場是第一次打這種前期爆炸後期翻盤的場,心情真的很好,開局由於A的模擬ffx一上來有個特判寫錯了,找了好久的bug也找不到,於是換了wk上來找bug,電腦分兩塊ffx在右面敲F,這時候wk找到了一個bug改了一下提交,又wa,時間已經一個多小時,全隊心情爆炸,之後ffx隨便想了一組A的樣例,發現有錯誤,原來wk找到bug之後特判的位置改錯了,又改了一下就過了,這時候ffx也敲完了F,submit,wrong anwser,返回檢視程式碼,怎麼算怎麼對,後來發現字串長度要判一下,不然可能會非法訪問,改了之後ffx加了個初始化的ans,如果不滿足條件就不走第二種,但是由於當時沒想到答案會出現負數,又wa了,下來之後發現了這個問題,改了就過了,這時候已經rank107了,在ffx敲F的時候wk發現C是個貪心,於是F過了就上機開始敲,然後就1A了,交了之後rank變成了102,wk敲C的時候ffx和sbw推出了K的一些東西,ffx上機敲了K題,又是1A,rank75,ffx敲k的時候wk發現B是個做過的tarjan,改改就能過,於是ffx交了K之後wk上機開始抄板子,但是敲完之後發現樣例怎麼也過不去,開始了將近半小時的找bug之旅,找了半小時之後,ffx決定換個板子敲一下,ffx拿出自己以前的板子對比一下發現,wk的板子有個cnt寫錯了(由於wk將棧改為手寫,之後忘記測試,導致板子出現問題,以後還是要注意一下),之後改掉了模板的錯誤,B也1A了,rank變為52,已經滾到銀牌區了,由於三個人過於興奮,導致一個差不多做過同類型的D最後沒開出來,又滾回了銅首,不過也算是翻盤了,很是開心。
題解
A.F 細節模擬題
A.要注意之前都用光的時候是不需要消耗次數去合併的
F.要注意可能出現負數,可能串長不夠
A題程式碼 https://paste.ubuntu.com/p/mnVMkYD9TV/
F題程式碼 https://paste.ubuntu.com/p/jzXBfHkZt4/
B題tarjan
題意建模之後就是對一個有向圖並且每個點有權值的圖進行選點,要求最終的點集要能到達每個點而且點集的權值和最小,當弄懂題意之後就是一個裸的tarjan了,縮點之後在每個入度為0的聯通塊裡面選一個最小的加入貢獻就可以了。
https://paste.ubuntu.com/p/Kxtdy86tFC/
C題貪心
從後往前貪心,由於要求每一段都是整數秒跑完,每一段都儘量保持一個很大的速度,如果這個速度大於當前區間長度,就把速度變為當前區間長度/s,否則就看當前速度需要幾秒,如果是整數秒就直接取,如果不是整數秒就讓當前秒數+1,速度調成相應的速度。
https://paste.ubuntu.com/p/pWRbJJF7jh/
D題二分列舉
我們能夠證出最終的長度是小於10的,這位時候我們發現情況太多,大概有10!種,當遇到這種去全排列會超時而分成兩半去排列不會超時的時候,就把原題分成兩半,分別存入陣列,排序,遍歷第一個陣列,然後查詢第二個陣列中滿足條件的結果數,(注意不要用map)。
https://paste.ubuntu.com/p/s2QBRFrKkY/
E.dfs
題意就是給你帶有1-9數字的塊,每個塊有a[i]個,給你無數個+無數個=,問最多用已有的塊湊出多少等式。1+2=3,2+1=3算兩種。
我們推一下發現只有32種等式,但是這樣列舉每種等式是否選擇的時候2^32會超時,然後我們發現1+2=3,2+1=3,這兩種等式可以在一起向下遞迴,只不過一個是所有塊-2,另一個是-1,我們就把複雜度從Z2322^{32}變成了3203^{20},但是這樣還有可能不會AC,我們再將答案最大值優化加上,也就是就算後面全選都不會超過當前最大值,這樣的話我們就AC了,202ms。
https://paste.ubuntu.com/p/rJYnZyhsgk/
K題二分圖
我們可以知道當s陣列中存在兩個質數的時候,肯定是不可以的,於是我們先本地打個表發現1e8之內兩個素數最大的差是200多,猜想一下1e9最多也就600,於是先將兩個陣列相交的部分去掉,當s陣列長度超過600是就是NO,否則對每個s陣列能整除a陣列的元素建立邊,跑一下二分圖看是否可以完全匹配就可以了。
https://paste.ubuntu.com/p/pd6zC9N6yY/

ICPC2016北京
A UVALive 7668 Harmonic Matrix Counter **3 / 19 **
B UVALive 7669 Binary Tree **1 / 14 **
C UVALive 7670 Asa’s Chess Problem **20 / 61 **
D UVALive 7671 What a Beautiful Lake(模擬題) **198 / 382 **
E UVALive 7672 What a Ridiculous Election(bfs) **123 / 647 **
F UVALive 7673 What a Simple Research(簽到題) **197 / 471 **
G UVALive 7674 A Triangle Puzzle **1 / 40 **
H UVALive 7675 A New Ground Heating Device **12 / 102 **
I UVALive 7676 A Boring Problem(二項式定理) **35 / 287 **(賽後過掉)
J UVALive 7677 Parrot **0 / 3 **
K UVALive 7678 JiLi Number(打表) **138 / 171 **

過程
這場開局ffx開了D題,發現是個水題,於是開始敲,敲了幾分鐘樣例過了,但是wk看了一下程式碼發現ffx日提理解的不對,於是改了重寫,由於思路變了一下導致寫了好久,十多分鐘之後才過掉,之後wk開始敲D,還是由於題意翻譯的不夠清晰,導致wa了兩發,這是不應該的,後來看清楚題意改改就過了,之後sbw說了一下k題最多可能只有12位,發現樣例給的就是12位,在sbw推測第12位有幾個的時候,ffx開始本地打表,本地跑得飛快,就跑出了12位之內的全部答案,然後交上去就1A了,之後ffx發現