AGC029 C Lexicographic constraints

相当于要求我们建一个 TRIE。那么二分答案,然后用数组维护 TRIE 的右链即可。

数组开不下,改成 map 即可。

复杂度

AGC030 C Coloring Torus

对于一个的网格,称为处于第行,第列的格子。一个对网格的好的染色是满足下述条件的染色方案:

  1. 每个格子被染成种颜色之一。
  2. 种中的每种颜色都被至少一个格子使用。
  3. 对于任意颜色,满足所有颜色为的格子,其相邻的颜色的格子个数相同。这里,与相邻的格子为(如果一个格子多次出现,那么会算多次)。

给出,选择一个,任意构造一个对的网格的好的染色。

时,每行一个颜色。

对于是偶数:

void make(int n){
    FOR(i,0,n-1)FOR(j,0,n-1)a[i][j]=(i+j)%n;
    FOR(i,0,n-1)if(i&1)FOR(j,0,n-1)a[i][j]+=n;
}

这样构造出来的矩阵是时的答案。

观察发现,把矩阵中所有的颜色替换为,矩阵的性质是不会被破坏的。那么我们可以用这个方法删掉一个颜色。

因此直接构造一个时的矩阵,然后删掉个颜色即可。

时间复杂度

AGC029 E Wandering TKHS

考虑结点 u 比父亲多走到了哪些点。设表示 u 的父亲。表示路径中结点编号的最大值。令表示 u 只经过的点能走到的后代结点数量(自己不算)。那么对于所有,我们有

原因是如果,那么以为起点时就不会访问到,我们就要新加入以及它子树中的信息。否则一定会访问到。但是从出发只会经过的点,而从出发为经过个点,所以要进行一定的修改。那么现在我们只要求出即可。

的转移式如下:

直接递归记忆化,复杂度是对的。因为对于,我们找到所有它后代中第一次的点并剪掉它这棵子树,之后的子树中点的询问就只剩下了。同理递归到每个点也只有常数种询问。

时间复杂度

AGC029 F Construction of a tree

这题 sb 了。读题度锅了导致自闭。

假设是根,先网络流从每个集合里选一个数形成一个的排列,把它们看作每个集合的关键点。接下来从开始贪心能找到父节点就接上去。相当于我们把每个集合的每个点与它的关键点连有向边,在图上 DFS。一个 DFS 生成树就是答案。

显然能构造出来一定是对的,考虑中途一步不能构造出来的时候,说明无论如何与已经确定的个点相关的边数都达不到条,显然这在树中是不可能的,因此是无解的。