Codeforces Round 650Codeforces #334 (Div. 1)

Posted denverjin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round 650Codeforces #334 (Div. 1)相关的知识,希望对你有一定的参考价值。

模拟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 650Codeforces #334 (Div. 1)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #650 (Div. 3) A. Short Substrings

Codeforces Round #650 (Div. 3) C. Social Distance

Codeforces Round #650 (Div. 3) C. Social Distance (前缀和)

Codeforces Round #650 (Div. 3) E. Necklace Assembly (暴力)

Codeforces Round #650 (Div. 3) D : Task On The Board

Codeforces Round #650 (Div. 3) E. Necklace Assembly 思维 暴力+二分