1. 程式人生 > 其它 >AtCoder Beginner Contest 246

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\)

的取值至多就是\(10^6\)

列舉\(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\)

\(a_u \ge 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}\)的線性組合,可以寫成矩陣乘的形式,然後矩陣乘是有結合律的,所以就可以線段樹維護。