yxy小蒟蒻的201110总结
2020.11.10 周二
今天A题时间算错了 B题被hack掉了(所以这体现了自己hack自己的能力多么重要
然后T4是我第一次写树套树吧 思想挺妙的 求lcp可以用线段树二分确实没想到
话说noip不会考树套树吧 (虽然没让我手写平衡树
A
给一个 n n n 个节点 m 条边的无向图, 有 k k k 轮操作, 每轮操作是选择尽量多的边删除, 如果有多种方案, 那么选择边权和最大的那个, 但是要求删除的边中不存在环.
对于每条边, 输出它在第几次操作被删除, 如果这条边最后都没有被删除那么输出 0 0 0.
每次都是找最大生成树 找到的边就删除
给边排序
枚举每条边 二分是可以插入哪一次的生成树
开 k k k 个并查集
B
有一个 n × n n\times n n×n 的黑白棋盘. 你需要用一些操作将整个棋盘变成全黑.
一次操作首先选择一行 i, 一列 j, 记 c 1 , c 2 , ⋯ , c n c_1, c_2, \cdots, c_n c1,c2,⋯,cn 为 ( i , 1 ) , ( i , 2 ) , ⋯ , ( i , n ) (i, 1), (i, 2), \cdots, (i, n) (i,1),(i,2),⋯,(i,n)的颜色. 之后将 ( 1 , j ) , ( 2 , j ) , ⋯ , ( n , j ) (1, j), (2, j), \cdots, (n, j) (1,j),(2,j),⋯,(n,j) 的颜色对应涂成 c 1 , c 2 , ⋯ , c n c_1, c_2, \cdots, c_n c1,c2,⋯,cn .
求最少的操作次数. 如果无法成功, 输出 − 1 -1 −1 .
构造题 先把一行涂黑 再把竖列不是全黑的涂黑
有细节 要学会自己 h a c k hack hack 自己
C
给定两个数 n , m n, m n,m 求有多少长度为 2 m 2m 2m 的序列 A A A 满足 A A A 中每个元素都是 n n n 的因数, 且 A A A 所有项的乘积不超过 n m n^m nm. 答案对 998244353998244353 998244353998244353 998244353998244353 取模.
呃呃呃呃 结论题
显然乘积小于 n m n^m nm 和大于 n m n^m nm 的方案个数是相等的
所以就是求等于 n m n^m nm 的方案数 因为每种质因数是独立的 所以直接背包做
D
有一棵深度为 n n n 的满二叉树, 初始每个节点都没有标记.
维护一个 n n n 位二进制数 x x x, 它对应了树根到叶子的一条路径: x x x 从高到低的每个二进制位表示下一步走向左儿子(这一位是 0 0 0)还是右儿子(这一位是 1 1 1).
初始 x = 0 x=0 x=0. 有 m m m 次操作, 每次操作令 x : = ( x + 2 c i ) m o d 2 n x := (x + 2^{c_i})\bmod 2^n x:=(x+2ci)mod2n , 然后将树上这条路径的所有节点打上标记. 每次操作后, 你需要输出有标记的节点个数.
题目可以转化为每次给你一个长度为 n n n 的零一串 每次询问和之前给出的串的 l c p lcp lcp 的最大值
因为串长是 1 e 5 1e5 1e5 级别的 所以直接求 l c p lcp lcp 不好求 而且也不能建 t r i e trie trie
所以我们给每个串维护一颗区间线段树 维护的值是对应串的区间的哈希值
因为最新的串是它前一个串的一段区间取反 所以可以用主席树 空间就能开下了
l c p lcp lcp 可以看作是求从高到底位 第一个不相等的位置(判断是否相等可以用哈希值比较 )
那么可以线段树上二分找 l c p lcp lcp 同理可以判断两个串的二进制大小(第一个不相等的位置为1的串大)
又因为和当前串的 l c p lcp lcp 最长的串 一定是按二进制排序下它的前驱或者后继
那么可以把它之前的串全放进一个 s e t set set 比较大小就在线段树上二分 本质上是树套树