atcoder Keyence Programming Contest 2020 题解

比赛地址数组

A

题意:给一个\(n*m\)的初始为白色的矩阵,一次操做能够将一行或一列染成
黑色,问至少染出\(k\)个黑点的最少操做次数。
\(n\),\(m\)<=100,\(k\)<=1e4spa

B

题意:有\(n\)条线段,用二元组\((x,len)\)表示,占据\([x-len,x+len]\)的位置。
问最多能选择多少条不相交的线段。
\(n\)<=1e5,\(x_i\),\(len_i\)<=1e9code

C

题意:给定\(n\),\(k\),\(s\),构造一个序列\(a\),使得刚好有\(k\)个二元组\((l,r)\),\(\sum_{i=l}^{r} a[i]\) = \(s\)
\(n\)<=1e5,0<=\(k\)<=\(n\),\(s\)<=1e9,\(a_i\)<=1e9排序

D

题意:有\(n\)张卡片,初始时每张卡片上面是\(a[i]\),下面是\(b[i]\)。一次操做能够交换相邻两张牌,
并将这两张牌翻转。最小化操做次数,使得上面的数组成的序列不降。
\(n\)<=18,\(a_i\),\(b_i\)<=50get

E

题意:给定一个\(n\)\(m\)边的无向图,每一个点能够被染成黑色或白色,每条边能够指定一个[1,1e9]之内的权值。
找出一种染色和给定边权的方案,使得:
1.至少存在一个黑点,一个白点;
2.每一个点到与其最近的颜色相异的点的距离为\(d_i\)
\(n\)<=1e5,\(m\)<=2e5,\(d_i\)<=1e9入门

F

题意:有一个\(n*m\)的矩阵,初始时每一个点都有一个颜色。
你能够对其进行任意次操做,每次操做能够任选一行(列),将这一行(列)的点全染成黑(白)色。
问共能操做出多少种不一样的矩阵。答案对998244353取模。
\(n\),\(m\)<=10class


题解

A

入门题。根据\(n\),\(m\)大小判断染行仍是染列。
时间复杂度:\(O(1)\)test

B

经典的贪心问题。将全部线段按右端点排序,直接扫一遍,维护一下当前选到的右端点就好。
时间复杂度:\(O(nlogn)\)im

C

\(傻逼题\)。直接指定\(k\)点权值为\(s\),剩下的都为\(s+1\)就行。注意\(s\)=1e9须要特判。
时间复杂度:\(O(n)\)移动

D

\(n\)很小,引导咱们能够用指数级别的复杂度作题。首先能够想到暴力枚举全部牌最后哪边朝上。
考虑如何断定一个方案是否合法,并判断其最小的移动步数。
咱们将这个状态设为\(S\),它的第\(i\)位为1就表明它是\(b_i\)朝上,不然是\(a_i\)朝上。

step1

1的个数必定是个偶数。

step2

咱们根据这个01序列,能够获得最终的一个无序序列\(C\)。将这个序列排序,如今要作的就是
找一个合法的匹配方案。
可能读者会有些疑惑:这里为何还要判断是否合法呢?
考虑那个01序列的另一层意义:若是某一位为1,那么这一位的这张牌就移动了奇数次,不然就是偶数次。
这个东西分奇偶讨论一下,用vector存一下全部\(c_i\)\(的全部出现位置,一一匹配就行。 因为\)C\(中可能有重复元素,最优策略就是原序列中左边的点尽可能和排序后的\)C\(的左边的点匹配。这个是显然的。 这样,咱们就至关于获得了一个排列\)P$,表示一种匹配方案。

step3

那么肯定这个方案合法后,如何求出最少的移动步数呢?能够发现这就是这个排列的逆序对个数。把它算出来,更新答案。
时间复杂度:O(\(2^n\) \(\times\) \(n^2\))

E

考虑从何下手这个问题。
首先,咱们确定但愿这个最短路尽可能好求一些。最好是全部的匹配都是两点直接相连的。
固然事实确实是这样的。这里给出一个证实。
考虑反证法:若是存在一种匹配方案\(a->c\),\(b->c\),\(a\),\(b\)是黑点,\(c\)是白点,且这三点的连边状况是:\(a---b---c\)
首先,若是\(b\)\(c\)匹配,那么\(a\)不会和其余点匹配。

状况1

\(d_a\)<\(d_b\):显然这种方案是不合法的;

状况2

\(d_a\)>=\(d_b\):显然能够将\(b\)换成白点,\(c\)换成黑点(不换也行,具体看状况)。
所以,如有解,必定存在一种匹配方案,使得全部点都和它直接相连的一个点匹配。
接下来,考虑这样的一个匹配过程:
一个节点\(A\)找到了另外一个节点\(B\),与其匹配。那么那个节点\(B\)有两种选择:一是和\(A\)匹配,一是和其余节点匹配。
重点是,不管如何匹配,\(d_B\)必定大于等于\(d_A\)
由此下去,必定有一个最终状态,节点\(B\)别无他选,只能和\(A\)匹配。咱们发现了隐藏在题目中的单调性。
由此,咱们获得了一个作法:先将全部节点按\(d_i\)从小到大排序,而后对于每一个节点,
先找有没有与其直接相连的未被染色的点,且二者的\(d\)相同。如有,则两点互相匹配,若没有,再找一个已被染色的点,
与其匹配便可。若尚未,则无解。
注意必定要先找能互相匹配的点,由于一次能够染两个节点的色。
时间复杂度:\(O(nlogn+m)\)

F

待填坑~


代码

先咕在这里,等写完F再放吧~

相关文章
相关标签/搜索