1. 程式人生 > >【Codeforces Round 650】Codeforces #334 (Div. 1)

【Codeforces Round 650】Codeforces #334 (Div. 1)

不同的 -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)