AtCoder Beginner Contest 246
A - Four Points
對於橫座標,矩形的4個點會有2個不同取值,分別有兩個,給出其中3個,那麼將這3個數異或起來就是剩下的那個值。
縱座標同理。
B - Get Closer
輸出向量\((A, B)\)的單位向量即可。
C - Coupon
首先,如果有多個商品的價格大於等於\(X\),那麼把優惠券用在哪一個商品都是一樣的,掃一遍預處理掉這部分。
現在,所有商品的價值都是小於\(X\)的了,現在對某一個商品用優惠券相當於這個商品就免費了,所以排個序優先選擇價值大的商品使用優惠券。
D - 2-variable Function
首先,注意到由於立方項的存在,\(a\)和\(b\)
列舉\(a\)這一維,剩下\(b\)這一維是單調函式,可以二分找到使結果大於\(N\)且最小的\(b\)的取值。
這樣所有的可能性都考慮到了,取其中最小即可。
E - Bishop 2
BFS板子,就下一步的方向和當前方向相同則代價不增加。
F - typewriter
首先,有\(a\)個不同字母,長度為\(l\)的串,有\(a^l\)種。
然後,多行之間的答案可能有重複,重複的部分就是它們的並集,而這個並集是有每行字母的並集生成的,很容易想到容斥原理。
由於\(n\)最大隻有18,直接暴力列舉然後容斥就可以了。
G - Game on Tree 3
首先,可以看出答案滿足單調性,所以可以二分做。
假設現在列舉到的答案是\(x\),那麼只需要能走到一個大於等於\(x\)的點然後結束遊戲,就可行。不妨將點分為兩類,一類小於\(x\),一類大於等於\(x\),那麼後手玩家的操作就變成了把第二類的節點轉成第一類的。考慮使用動態規劃判斷是否可行。
記\(dp_u\)表示走到\(u\)之前,\(u\)的子樹中最少需要多少操作,才能讓先手玩家無法在\(u\)的子樹中贏得遊戲。對於葉子節點其取值顯然是1,且如果\(dp_{root} \ne 0\)則說明先手方可以獲得大於等於\(x\)的結果。
對於\(u\)這個節點,首先\(u\)自身可能需要耗費操作,\(a_u < x\)的話就可以不操作\(u\)
然後,\(u\)往子樹走的這一步可以用來完成一個操作,這一個操作只可以用在處理\(u\)的子樹,不包括\(u\)。
最後就是子樹中需要的操作也可能需要在進入\(u\)之前就完成,然後除了上一步說到的那一個操作之外,其餘\(u\)的子樹中的操作也需要在進入\(u\)之前完成。
這樣就有
\[dp_u = [a_u \ge x] + \max(0, -1 + \sum_{v is child of u} dp_v) \]Ex - Product Modulo 2
如果不考慮修改的話就是個簡單dp,看是以0
還是以1
結尾。
帶修改的話很容易想到線段樹之類的資料結構,然後就是線段樹單點修改,全域性詢問了。
因為其實把dp的轉移方程寫出來的話,可以發現\(dp_i\)其實就是\(dp_{i - 1}\)的線性組合,可以寫成矩陣乘的形式,然後矩陣乘是有結合律的,所以就可以線段樹維護。