【Codeforces Round 650】Codeforces #334 (Div. 1)
阿新 • • 發佈:2019-04-09
不同的 -c 枚舉 只需要 拓撲排序 math codeforce 怎麽 row
模擬CF650,ABC三題,RK90
Codeforces 650 A
思路:首先看式子
\(\sqrt{(x_i-x_j)^2+(y_i-y_j)^2}=|x_i-x_j|+|y_i-y_j|\)
的唯一可行的情況是\(x_i=x_j\)或\(y_i=y_j\)。(因為兩邊之和大於第三邊
所以就知道怎麽做了。
- 第一種方法:我們維護三個\(map\),分別存行、列、坐標是\(\dots\)的時候已經有多少個節點。
然後就可以邊讀邊算,讀到\((x,y)\)這個坐標的時候把\(ans\)變成
\(row_x+col_y-cnt_{(x,y)}\)就可以了。 - 第二種方法:我們先讀完所有的坐標,然後存同一個行、列、坐標各有多少個。
\(\sum C_{row_x}^2+C_{col_y}^2-C_{cnt_{(x,y)}}^2\)即可。
Codeforces 650 B
思路:二分/two pointers
。
我只會二分了。。。
首先確定我們肯定是向左翻幾個,再向右翻幾個。(或者相反
那麽我們就枚舉向左翻到了哪一個(註意復制一遍原數組
然後二分右邊到了多少個,用前綴和算一下代價。
然後two pointers
看起來沒多少人寫???
註意代價要開long long
。
Codeforces 650 C
思路:首先我們把每一行排序。
肯定現在相同的數在“壓縮”過後也是相同的。
那就扔到並查集裏面當做是一個節點。
然後如果\(x\)小於\(y\)就從\(x\)所在並查集的代表元向\(y\)所在的代表元連邊。
這說明\(y\)的壓縮後的值肯定大於\(x\)壓縮後的值。
但這樣邊數是\(O(n^2)\)的。
註意到我們這樣連邊等價於我們只連同一行內大小連續的數的邊。
這樣就很可做了。直接一把\(bfs\)標記在\(dag\)上下推即可。
還可以直接拓撲排序後一個小小的\(dp\)。
其實沒有必要正經地“拓撲排序”,只需要把所有的格子按照數的大小排就可以了。
因為從小的到大的連邊啊。。。
那樣就可以一個main
函數幹到底了(霧
【Codeforces Round 650】Codeforces #334 (Div. 1)