摘要: 我们考虑离线,把第三种操作挂在第二种上,那么我们只需要查询对应时刻的森林中某个点是不是当前操作点的祖先即可 因为只有加边操作,我们把森林的祖先后代关系变成判断他在离线的最终树上的祖先后代关系和判断两点是否连通 并查集维护连通性,LCA查询祖先后代关系 复杂度\(O(m log n)\) 1 #inc 阅读全文
posted @ 2020-02-10 18:33 幽蝶 阅读(160) 评论(0) 推荐(0) 编辑
摘要: 考虑把p和q的限制看成边,然后\(s[p_i] \leq s[p_{i+1}]\)为一条\(p_i\)指向\(p_{i+1}\)的边 那么这样建出的图显然一个SCC内的必须相同 那么就是判断tarjan缩点后的图最长路是否>=k 复杂度\(O(n+m)\) 1 #include<bits/stdc+ 阅读全文
posted @ 2020-02-10 17:45 幽蝶 阅读(124) 评论(0) 推荐(0) 编辑
摘要: 正常的字典序最小拓扑序是用pq正着做就行的 但是这个他不是求字典序最小的拓扑序,而是对每个点赋一个权值(权值为一个排列),使得权值大小满足拓扑序的关系,且最小化权值序列的字典序 这个东西是不能正着贪的,有一个简单的反例是n=4,m=2,4->1,3->2 因为这个东西对应的不是使权值小的编号尽可能小 阅读全文
posted @ 2020-02-10 17:06 幽蝶 阅读(159) 评论(0) 推荐(0) 编辑
摘要: 一个字符串能重排成回文串等价于这个字符串最多只有一个字符出现次数为奇数次 这题的询问和子树中深度有关,那么显然可以用dsu on tree解决 把询问离线下来挂在点上,然后按dsu on tree的顺序统计子树信息即可 复杂度\(O(nlogn+26m)\) 1 #include<bits/stdc 阅读全文
posted @ 2020-02-10 12:04 幽蝶 阅读(155) 评论(0) 推荐(0) 编辑
摘要: A. 从集合角度考虑式子的意义,就是选第一个数作为全集然后抠掉第二个数为1的位 连着做这个过程就是选一个数作为全集然后连着抠掉一些位 这样我们只要枚举第一个数就行了,前后缀加速一下这个过程 1 #include<bits/stdc++.h> 2 using namespace std; 3 int 阅读全文
posted @ 2020-02-10 10:45 幽蝶 阅读(167) 评论(0) 推荐(0) 编辑