12 2018 档案

摘要:允许5%的相对误差,意味着我们可以只输出$\log_{1.05} V$种取值并保证答案合法。并且注意到答案随着区间长度而单增,故取值不同的答案区间是$O(\log_{1.05} V)$的。 于是初始x=0,每次x=max(x+1,x*1.05),再用单调队列$O(n)$找出当前x能更新的区间即可。总 阅读全文
posted @ 2018-12-30 10:39 HocRiser 阅读(300) 评论(0) 推荐(0)
摘要:https://blog.csdn.net/maxwei_wzj/article/details/80789619 感觉主要难在想到通过f,g来求F,G。 代码实现调换了题解中f,g的两维。 阅读全文
posted @ 2018-12-30 00:13 HocRiser 阅读(170) 评论(0) 推荐(0)
摘要:https://blog.csdn.net/Maxwei_wzj/article/details/80714129 n个二项式相乘可以用分治+FFT的方法,使用空间回收可以只开log个数组。 阅读全文
posted @ 2018-12-29 22:36 HocRiser 阅读(307) 评论(0) 推荐(0)
摘要:暴力枚举非树边取值做DP可得75。 注意到每次枚举出一个容斥状态的时候,都要做大量重复操作。 建立虚树,预处理出虚树上两点间的转移系数。也可动态DP解决。 树上倍增、动态DP、虚树DP似乎是这种问题的三种通用解法。 代码不是特别长但极其难写,预处理过程中要考虑各种情况。水平不够只好抄代码。 阅读全文
posted @ 2018-12-29 20:18 HocRiser 阅读(263) 评论(0) 推荐(0)
摘要:MinMax容斥将问题转化为求x到S中任意点的最小时间。 树形DP,直接求概率比较困难,考虑只求系数。最后由于x节点作为树根无父亲,所以求出的第二个系数就是答案。 https://blog.csdn.net/dearbaba_8520/article/details/80556499 $O((n+q 阅读全文
posted @ 2018-12-29 20:13 HocRiser 阅读(262) 评论(0) 推荐(0)
摘要:用一棵Splay按名次维护每个点,其中一个节点对应初始编号连续的一段区间,这样总节点数是$O(m)$的。 对每个编号记录这个点被Splay的那个节点维护,用std::map存储,只记录被修改的点。 每次删除时将一个点分裂成[l,k-1],k,[k+1,r]三个点(特判k=l或k=r),再删除k。 注 阅读全文
posted @ 2018-12-28 18:46 HocRiser 阅读(197) 评论(0) 推荐(0)
摘要:点分治,对于每个分治中心,考虑求出经过它的符合长度条件的链的最大权值和。 从分治中心dfs下去取出所有链,为了防止两条链属于同一个子树,我们一个子树一个子树地处理。 用s1[i]记录目前分治中心伸下去的链中长度为i的链的最大权值,s2[i]记录新子树中的链的最大权值。 分数规划,考虑合并,枚举长度, 阅读全文
posted @ 2018-12-25 19:55 HocRiser 阅读(189) 评论(0) 推荐(0)
摘要:支配树目前只见到这一个应用,那就不独分一类,直接作为拓扑排序题好了。 每个点向所有食物连边,定义fa[x]为x的支配点,即离x最近的点,满足若fa[x]灭绝,则x也要灭绝。 这样,将fa[x]向x连边,则建出的新图是一棵树,这就是支配树(不是严谨的支配树,被出题人称为灭绝树) 建树流程是,将拓扑序反 阅读全文
posted @ 2018-12-19 14:43 HocRiser 阅读(185) 评论(0) 推荐(0)
摘要:起床困难综合症那题,只要从高往低贪心,每次暴力跑一边看这一位输入0和1分别得到什么结果即可。 放到序列上且带修改,只要对每位维护一个线段树,每个节点分别记录0和1从左往右和从右往左走完这段区间后变成的数即可。 放到树上,只要树链剖分即可。但这里有一个很大的常数k,实际上我们只需要一个数就可以记录64 阅读全文
posted @ 2018-12-17 02:58 HocRiser 阅读(196) 评论(0) 推荐(0)
摘要:首先merge就是先delete两次再insert,Max就是整个区间的最大值减最小值,Min就是区间中所有相邻两数差的最小值。 Splay支持区间最大值,区间最小值,区间相邻差最小值即可。 阅读全文
posted @ 2018-12-16 19:01 HocRiser 阅读(196) 评论(0) 推荐(0)
摘要:越来越写不来简单题了。 就是求a[i]到b[i]之间的位置有多少个数是第一次出现且目前仅出现了一次。树状数组,每次给第一次出现的数的位置+1,若到了第二次出现的位置,则将第一次出现的位置-1即可。 阅读全文
posted @ 2018-12-16 18:34 HocRiser 阅读(165) 评论(0) 推荐(0)
摘要:对每行每列分别建一个点,问题转为选n+m条边,并给每条边选一个点覆盖,使每个点都被覆盖。也就是最小生成环套树森林。 用和Kruskal一样的方法,将边从小到大排序,若一条边被选入后连通块仍然是一个环套树(即边数不多于点数)则连上。证明大致同Kruskal。 阅读全文
posted @ 2018-12-16 16:12 HocRiser 阅读(258) 评论(0) 推荐(0)
摘要:莫队,cnt数组记录每个数的个数,bitset b1[i]记录数i是否出现过,b2[i]记录数M-i是否出现过。 减法:((b1>>x)&b1).any()。 加法:(((b2>>(M-x))&b1).any()。 乘法:若存在一定有一个数<=sqrt(1e5),枚举即可。 复杂度:$O(n\sqr 阅读全文
posted @ 2018-12-15 13:16 HocRiser 阅读(176) 评论(0) 推荐(0)
摘要:首先冷静一下看清问题的本质,是将整个数列分成两个递增子序列。 那么由Dilworth定理得,无解当且仅当数列的最长下降子序列的长度>2,先特判掉。 然后就有一些比较厉害的做法:http://www.cnblogs.com/Gloid/p/10025835.html 一种比较直观的做法是,将每对逆序对 阅读全文
posted @ 2018-12-15 12:19 HocRiser 阅读(242) 评论(0) 推荐(1)
摘要:第一种方法是决策单调性优化DP。 决策单调性是指,设i>j,若在某个位置x(x>i)上,决策i比决策j优,那么在x以后的位置上i都一定比j优。 根号函数是一个典型的具有决策单调性的函数,由于根号函数斜率递减,所以i决策的贡献的增长速度必定比j快。 于是使用基础的决策单调性优化即可。 注意两个问题,一 阅读全文
posted @ 2018-12-15 11:45 HocRiser 阅读(297) 评论(0) 推荐(0)
摘要:比较神的一道题,正解比较难以理解。 首先不难得出一个(nm)^3的算法,对所有串建AC自动机,将在每个点停止的概率作为未知数做高斯消元即可。 可以证明,AC自动机上所有不是模式串终止节点的点可以看成一个点,不妨合并为同一个点(n+1号点)。 对于一个模式串,它肯定是从n+1号点走了m步后到达的,概率 阅读全文
posted @ 2018-12-14 19:18 HocRiser 阅读(234) 评论(0) 推荐(0)
摘要:https://blog.csdn.net/KsCla/article/details/78249148 用类似经典的链上区间颜色计数问题的做法,这个题可以看成是询问DFS在[L[x],R[x]]中,深度在[dep[x],dep[x]+d]中,上一个同色点在[0,L[x]-1]中的点的个数。这是个三 阅读全文
posted @ 2018-12-11 20:02 HocRiser 阅读(222) 评论(0) 推荐(0)
摘要:比较自然的思路是,由于需要记录连通块合并时的信息,所以需要建出Kruskal重构树。 需要用LCT维护,支持加点和在线LCA操作。 不妨考虑在并查集合并的同时记录信息,pre[x]表示x与它的父亲相连的时刻。 两个点连通的时刻,等于两个点之间路径上时刻的最大值。 注意到按秩合并但不路径压缩的并查集不 阅读全文
posted @ 2018-12-10 19:42 HocRiser 阅读(218) 评论(0) 推荐(0)
摘要:可持久化Trie模板题。 建两种可持久化Trie,每个点两棵,一棵对DFS求前缀和,一棵对祖先求前缀和。 或者树剖,不好写多少还多个log。 阅读全文
posted @ 2018-12-10 19:21 HocRiser 阅读(247) 评论(0) 推荐(0)
摘要:线段树基础操作题,唯一需要思考下的是将区间的前k个0覆盖为1。 线段树上二分,先递归到左子树覆盖,回溯时返回还剩多少个0未被覆盖,在根据这个信息递归到右子树。注意特判k=0的情况。 要维护的信息有:区间左边最长0连续段,右边最长0连续段,区间整体最长0连续段,区间内1的个数,以及一个记录是否被区间覆 阅读全文
posted @ 2018-12-09 12:06 HocRiser 阅读(268) 评论(0) 推荐(0)
摘要:经典问题,按位贪心,每次需要知道的是”在这一位之前的位都以确定的情况下,能否找到这一位是0/1的数”,这就是在询问[L,R]内某个值域区间是否有数,主席树即可。 阅读全文
posted @ 2018-12-09 10:41 HocRiser 阅读(150) 评论(0) 推荐(0)
摘要:两种做法,前一种会TLE。 第一种是高一数学题做法,设一个妖怪的atk和dnf分别为x和y,则它在(a,b)环境下的战斗力为x+y/a*b+y+x/a*b。 设t为b/a,则战斗力即$f(x,y,t)=x+y+tx+\frac{y}{t}$,其中$t\in(0,+\infty)$。 二分答案c,问题 阅读全文
posted @ 2018-12-09 08:51 HocRiser 阅读(352) 评论(2) 推荐(1)
摘要:首先有一个显然的$O(n^2)$暴力做法,将每个位置看成点,然后将所有限制相等的数之间用并查集合并,最后答案就是9*(10^连通块的个数)。(特判n=1时就是10)。 然后比较容易想到的是,由于每次合并的是一个区间,逐个合并点过于浪费时间,考虑用线段树建图优化复杂度,但发现线段树建图并不能支持题目中 阅读全文
posted @ 2018-12-08 17:32 HocRiser 阅读(163) 评论(0) 推荐(0)
摘要:1.题意表述十分难以理解,简单说就是:有n个单词,确定一个背的顺序,使总代价最小。 2.因为第(1)种情况的代价是n*n,这个代价比任何一种不出现第(1)种情况的方案都要大,所以最后肯定不会出现“背某个单词的时候它的后缀还没背”的情况。 3.考虑将每个串和单词表中它的最长后缀连边,则形成了一棵树。我 阅读全文
posted @ 2018-12-07 20:05 HocRiser 阅读(233) 评论(0) 推荐(0)
摘要:https://blog.csdn.net/xyz32768/article/details/81591955 首先区间DP和状压DP是比较明显的,设f[L][R][S]为将[L,R]这一段独立操作最终得到的字符序列为S的最大收益。其中S的位数为(R-L)%(k-1)+1。 枚举R第一次参与的操作的 阅读全文
posted @ 2018-12-06 19:27 HocRiser 阅读(276) 评论(0) 推荐(0)
摘要:考虑任何一条垂直于x轴的直线,由于圆不交,所以这条直线上的圆弧构成形似括号序列的样子,且直线移动时圆之间的相对位置不变。 将每个圆拆成两边,左端加右端删。每次加圆时考虑它外面最内层的括号属于谁。用set维护括号序列,每次从插入的位置往上找,如果第一个找到的是上括弧则说明被它包含,如果是下括弧说明和它 阅读全文
posted @ 2018-12-04 00:16 HocRiser 阅读(190) 评论(0) 推荐(0)
摘要:首先可以确定是树形DP,但这里存在跨子树的信息传递问题,这里就需要“借”的思想。 f[i][j]表示i子树内所有点都被覆盖到,且i以外j层内的点都能被覆盖到 的方案数。 g[i][j]表示i子树内离i距离不小于j的点都被覆盖到 的方案数。 这里f做了一个前缀和,g做了一个后缀和。 那么f有转移: 1 阅读全文
posted @ 2018-12-03 19:38 HocRiser 阅读(189) 评论(0) 推荐(0)
摘要:结论:固定端点的所有子段GCD只会有$O(\log)$种,因为一个数的质因子个数是这个级别的。 从左到右枚举右端点,用一个数组记录所有GCD相同的子段的第一个位置,每次线性更新与合并。$O(n\log n)$ 阅读全文
posted @ 2018-12-02 20:24 HocRiser 阅读(196) 评论(0) 推荐(0)
摘要:有一个结论:对于边<u,v>,若这是u到v的唯一路径,则这条边显然不可被删去,否则必然可以被删去。 因为若u到v还有其它路径,则必然是从u到某个点x再到v,由于最终答案中连通性不变,也就是最终答案中仍然可以走到x后再走到v,于是可以删去这条边。 于是大致算法就出来了:按拓扑序从后往前做,每次将这个点 阅读全文
posted @ 2018-12-02 20:20 HocRiser 阅读(178) 评论(0) 推荐(0)
摘要:一开始写了7个DP方程,然后意识到这种DP应该都会有一个通式。 三个条件:有色行数为n,有色列数为m,颜色数p,三维容斥原理仍然成立。 于是就是求:$\sum_{i=0}^{n}\sum_{j=0}^{m}\sum_{k=0}^{p}(-1)^{n+m+p-i-j-k}\times C_n^i\ti 阅读全文
posted @ 2018-12-02 19:53 HocRiser 阅读(272) 评论(0) 推荐(0)
摘要:链上是经典贪心问题,将线段全按左端点排序后把点全撒在线段右端点上。这里放到环上,倍长即可。 题目保证不存在区间包含情况,于是有一种暴力做法,先将战士的管辖区间按左端点从小到大排序,对于询问x,从x战士出发,每次走到最远(管辖区间左端点最大)的一个战士,满足这个战士的区间左端点被x的区间右端点覆盖到, 阅读全文
posted @ 2018-12-02 17:57 HocRiser 阅读(179) 评论(0) 推荐(0)
摘要:建出对偶图,删除一条边时将两边的格子连边。一条边两端连通当且仅当两边的格子不连通,直接并查集处理即可。 阅读全文
posted @ 2018-12-02 16:57 HocRiser 阅读(198) 评论(0) 推荐(0)
摘要:怎么也没想到是子集DP,想到了应该就没什么难度了。 首先n>21时必定为NO。 g[i][j]表示位置i后的第一个字母j在哪个位置,n*21求出。 f[S]表示S的所有全排列子序列出现的最后末尾位置,枚举最后一个字母转移。21*2^21 阅读全文
posted @ 2018-12-02 13:32 HocRiser 阅读(249) 评论(0) 推荐(0)
摘要:https://www.cnblogs.com/Skyminer/p/6435544.html 先不要急于转化成几何模型,先把式子化到底再对应到几何图形中去。 阅读全文
posted @ 2018-12-02 12:27 HocRiser 阅读(179) 评论(0) 推荐(0)
摘要:根据欧拉函数的定义式可知,可以先算出a[l]*a[l+1]*...*a[r]的值,然后枚举所有存在的质因子*(p-1)/p。 发现这里区间中一个质因子只要计算一次,所以指计算“上一个同色点在区间外”的数。记录pre就是二维数点问题了,套路地用主席树即可。 被卡常。别的OJ过了BZOJ过不了,优化常数 阅读全文
posted @ 2018-12-01 23:26 HocRiser 阅读(304) 评论(0) 推荐(0)