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
沒想出來.....