摘要:AFO 阅读全文
posted @ 2019-07-19 12:14 HocRiser 阅读 (94) 评论 (3) 编辑
摘要:本题可以用的方法很多,除去以下三种我所知道的就还有至少三种。 方法一:类似线段树优化建图,将一个平面等分成四份(若只有一行或一列则等分成两份),然后跑Dijkstra即可。建树是$O(n\log n)$的,单次连边是$O(n\log^2 n)$的。 1 #include<queue> 2 #incl 阅读全文
posted @ 2019-07-30 20:37 HocRiser 阅读 (31) 评论 (0) 编辑
摘要:AFO 阅读全文
posted @ 2019-07-19 12:14 HocRiser 阅读 (94) 评论 (3) 编辑
摘要:树剖裸题,当然LCT也可以。 树剖: LCT: 阅读全文
posted @ 2019-07-12 19:07 HocRiser 阅读 (11) 评论 (0) 编辑
摘要:显然可以通过后缀数组快速找到询问的两个串分别是什么,然后正反各建一个后缀数组来求两个串的LCP和LCS即可。 阅读全文
posted @ 2019-07-12 16:19 HocRiser 阅读 (10) 评论 (0) 编辑
摘要:回文树(也就是回文自动机)实际上是奇偶两棵树,每一个节点代表一个本质不同的回文子串(一棵树上的串长度全部是奇数,另一棵全部是偶数),原串中每一个本质不同的回文子串都在树上出现一次且仅一次。 一个节点的fail指针指向它的最长回文后缀(不包括自身,所有空fail均连向1)。归纳容易证明,当在原串末尾新 阅读全文
posted @ 2019-07-09 17:37 HocRiser 阅读 (37) 评论 (0) 编辑
摘要:首先枚举回文中心,然后显然中心两边要尽量扩展作为middle,这个用manacher实现。 然后注意到suffix的结尾位置是固定的(串尾),那么预处理出以每个位置结尾的串与原串后缀至多能匹配多长,然后再作个前缀和在枚举回文中心时尝试更新答案即可。这一部分将原串反过来用KMP实现,注意|suffix 阅读全文
posted @ 2019-06-29 18:39 HocRiser 阅读 (12) 评论 (0) 编辑
摘要:T1.桥梁(bridges/restriction) Subtask1:暴力,$O(n^2)$。 1 #include<cstdio> 2 #include<algorithm> 3 #define rep(i,l,r) for (int i=(l); i<=(r); i++) 4 #define 阅读全文
posted @ 2019-06-26 19:40 HocRiser 阅读 (49) 评论 (0) 编辑
摘要:A.外教 Michale 变身大熊猫 对每个i求出以它结尾的[1,i]中的LIS长度f1与个数g1,和以它开头的[i,n]中的LIS长度f2与个数g2,若f1+f2-1=整个数列的LIS长度,那么它出现在LIS中的概率就是g1*g2/整个数列LIS的个数。发现可以用线段树优化朴素DP转移,维护下区间 阅读全文
posted @ 2019-06-17 09:06 HocRiser 阅读 (30) 评论 (0) 编辑
摘要:A.直接模拟。 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #define rep(i,l,r) for (int i=(l); i<=(r); i++) 6 typedef 阅读全文
posted @ 2019-06-09 17:59 HocRiser 阅读 (10) 评论 (0) 编辑
摘要:类似维护括号序列,给每个点建两个点,然后所有操作都能轻松支持了。注意sum和lastans是long long。 阅读全文
posted @ 2019-06-09 09:17 HocRiser 阅读 (9) 评论 (0) 编辑