1. 程式人生 > 實用技巧 >Codeforces Round #689 (Div. 2)

Codeforces Round #689 (Div. 2)

A. String Generation

題意略

比較簡單的構造題目,直接"abcabcabc...."即可保證不會出現長度不超過\(k\)的迴文串

B - Find the Spruce

統計矩形方陣中三角形的個數

原來單個的'*'也算在三角形以內了,太淦了

O(\(n^2 \cdot m\))

首先三角形一定都長一樣,每一層的'*'分別是\(1,3,5......\),即可通過字首和統計'*',然後暴力列舉每個頂點,就可\(O(n^2 \cdot m)\)

O(n^2)

在討論區看到的神奇DP,思路比較巧妙

首先一個性質:除了一個'*'之外,其餘的三角形至少是由該點下方的三個'*'構成

定義\(dp[i][j]\)\((i,j)\)點樹的數量,轉移如下:

if s[i][j] == '*':
    dp[i][j] = min(dp[i+1][j-1], dp[i+1][j], dp[i+1][j+1]) + 1
else:
    dp[i][j] = 0 

答案即為所有\(dp[i][j]\)的和。

這類\(DP\)問題貌似有名字,如果想知道可以去\(CF\)討論裡面看看(我忘記了,\(qwq\))

C - Random Events

給定一個長度為 \(n\) 的陣列,給出 \(q\) 個操作 $( r , p ) $ 對$ [ 1 , r ]$區間進行有序排序,排序的概率是 \(p\)

,不變的概率自然就是$ 1 − p $。問最後陣列全部有序的概率是多少。

巧妙的貪心

一個性質:一旦陣列被排序,它就永遠不會未排序。

根據這個思路,可以發現,真正可以影響到整個陣列的,其實是\(r\)大於等於最後一個不有序的位置的操作

例如\(n=4,[3,1,2,4]\),有序陣列為\([1,2,3,4]\),顯然在\(i=3\)的位置是最後不有序,那麼\(r<3\)的操作都可以忽略,因為無論他們成功還是失敗,這個位置都無序。

D - Divide and Summarize

給出一個數組,你可以操作\(0\)次或若干次改變這個陣列。然後給出 \(q\) 個查詢,問能不能找到一個數組和等於 \(s\)

具體操作就是選取一個\(mid=[\frac{max(arry)+min(arry)}{2}]\) , 然後小於等於 \(mid\) 放左邊陣列,大於放右邊陣列,選擇一個數組代替原來的陣列

分治思想做法

式子裡面只有最大值最小值,直接排序,最小值和最大值肯定是陣列區間的第一個和最後一個,\(mid\)的位置也可以通過二分快速找到,就可以快速分割左右兩個陣列。

很明顯這種分割是有限的(每次只能從大於\(mid\)和小於\(mid\)裡面選一個),所以對原陣列操作產生的所有可能和放在一個\(set\) 裡面,查詢的時候直接判斷時候在裡面即可

其他做法

可能有二進位制做法,在討論裡面看到的,沒看懂什麼意思(大霧

E - Water Level

初始在飲水機中有\(k\)升水,每天需要消耗\(x\)升水,每天的一開始,\(John\)可以選擇往飲水機中加\(y\) 升水(可以不加)。問\(t\)天內是否能保證每時每刻飲水機內的水大於等於\(l\)升,小於等於$r $升

有解分為兩種情況,一種是無限天數都在範圍內(迴圈),另一種是\(t\)天內在範圍內

先把\(k-l\),\(r-l\)這樣就能忽略掉\(l\)了,不然資料實在太大了,資料除了\(x\),其他都是\(10^{18}\)級別的

分類討論一下:

\(x>y\),水位每一天都會下降,如果一直加水,每天都會減少\((x-y)\),看看夠用幾天的(一定要注意前幾天能不加水,別加超了)

\(x<=y\),那麼有個顯然的貪心,讓水位儘量低,這樣可以給後面留下容錯空間(表達不好,將就理解一下)

\(k\)是當前水量,如果夠一天的使用,則不加水,如果不夠一天的使用則加水

如果\(k+y>r\),無解

如果\(k+y<=r\),這裡就要判斷一下會不會出現迴圈的情況(有解),\(k+=y\)然後\(k\%=x\),如果這時候的\(k\)出現過,那就有迴圈了,有解

如果\(t\)迴圈到\(0\)了,有解

F - Mathematical Expression

沒想出來.....