上一页 1 ··· 17 18 19 20 21 22 23 24 25 ··· 38 下一页
摘要: 设$a$到$b$的边权为$c$的有向边的含义为$b\geq a+c$,则可以根据题意构造出一张有向图。 设$f[x]$为$x$点可行的最小值,$a[x]$为$x$位置已知的值,则$f[x]=\max(f[j]+w(j,i),a[x])$,其中$j$有边连向$i$。 通过拓扑排序+DP可以在$O(n) 阅读全文
posted @ 2016-03-13 02:31 Claris 阅读(696) 评论(1) 推荐(0)
摘要: 对于每种颜色,可以发现可以切的位置被分割成了若干段独立的区域。 给每个区域一个编号,将$m$种颜色的情况当成字符串来看,如果两个切口的字符串完全匹配,那么可以在这里切两刀。 可以构造hash函数,通过差分前缀和做到$O(n)$修改。 然后对于每一种相同的hash值,将切口按位置从小到大排序,通过组合 阅读全文
posted @ 2016-03-13 02:29 Claris 阅读(808) 评论(0) 推荐(0)
摘要: 设$lim=\sqrt{n}$。 若$k<lim$,预处理出: $F[i][x]$:$x$往上走$i$步到达的点。 $S[i][x]$:$x$不断往上走$i$步经过的点的和。 直接$O(1)$查询即可。 若$k\geq lim$: 查询时用树链剖分划分为$O(\log n)$条重链,在每条重链上暴力 阅读全文
posted @ 2016-03-13 02:28 Claris 阅读(661) 评论(3) 推荐(0)
摘要: 将$c$离散化,设: $f[i][j][k]$为区间$[i,j]$最小值为$k$的最大收益。 $g[i][j][k]$为$\max(g[i][j][k..m])$。 $h[i][j]$为对于当前DP区间,经过$i$点的,费用限制$\geq j$的人数。 然后直接DP即可,时间复杂度$O(n^3m)$ 阅读全文
posted @ 2016-03-13 02:26 Claris 阅读(1210) 评论(0) 推荐(1)
摘要: 两遍树形DP求出每个点开始往上往下走的前3长路以及每个点上下部分的直径。 枚举每条边断开,设两边直径分别为$A,B$,则: 对于第一问,连接两边直径的中点可得直径为$\max(A,B,\lfloor\frac{A+1}{2}\rfloor+\lfloor\frac{B+1}{2}\rfloor+1) 阅读全文
posted @ 2016-03-13 02:25 Claris 阅读(665) 评论(0) 推荐(0)
摘要: 对于每个询问,设不小于$s$的个数为$cnt$,小于$s$的和为$sum$。 那么如果可以进行$s$轮,当且仅当$sum\geq (c-cnt)\times s$。 权值线段树维护,时间复杂度$O(m\log m)$。 证明: 如果$cnt\geq c$,那么显然可以每次取$c$个。 否则如果$su 阅读全文
posted @ 2016-03-13 02:23 Claris 阅读(740) 评论(0) 推荐(0)
摘要: 详细做法以及证明请看论文《Hamiltonian paths in the square of a tree》。 首先将1到n的路径提取出来,作为主干。 定义毛毛虫为去掉叶子之后只有一条单链的树,定义non-trivial的毛毛虫为单链非空的毛毛虫。 对于主干上每个点,计算它的非主干部分是否是毛毛虫 阅读全文
posted @ 2016-03-12 17:25 Claris 阅读(692) 评论(0) 推荐(1)
摘要: 设 $fl[i]$表示从$S$向左走,用了不超过$i$天且不回头的最大收益。 $fr[i]$表示从$S$向右走,用了不超过$i$天且不回头的最大收益。 $gl[i]$表示从$S$向左走,用了不超过$i$天且回到$S$的最大收益。 $gr[i]$表示从$S$向右走,用了不超过$i$天且回到$S$的最大 阅读全文
posted @ 2016-03-10 22:04 Claris 阅读(603) 评论(0) 推荐(1)
摘要: 将分组计划按照$k$从小到大排序,维护一个单调栈,每个元素为一个矩形,按最底下元素从高到低排列,栈顶最低。 每次加入一个矩形可选区域,维护单调栈,可以往回合并。 然后将所有最低点不满足的矩形取出,合并后放回。 每次考虑栈顶区域,将它取到和下一个矩形底边一致时合并。 可持久化线段树维护,时间复杂度$O 阅读全文
posted @ 2016-03-10 12:08 Claris 阅读(861) 评论(0) 推荐(1)
摘要: 如果两个相邻的串可行,那么它们合并后一定可行,所以求出所有可行的串的个数$t$,则$ans=2^{t-1}$。 注意特判整个串不可行的情况,这个时候答案为0。 #include<cstdio> int n,m,i,t,ans;char a[300010]; int main(){ for(scanf 阅读全文
posted @ 2016-03-08 20:41 Claris 阅读(221) 评论(0) 推荐(1)
摘要: 找到一棵dfs搜索树,给每条非树边一个随机非0权值,每条树边为所有经过它的树边的权值的异或。 那么有2种情况是合法的: 1.一条边权值为0,一条边权值非0。 2.两条边异或和为0。 排序后统计即可,时间复杂度$O(m\log m)$。 #include<cstdio> #include<algori 阅读全文
posted @ 2016-03-08 14:05 Claris 阅读(656) 评论(0) 推荐(1)
摘要: 最小的合法串长是$O(n^2)$级别,所以当$n>21$时无解。 设$g[i][j]$为$i$后面第一个字符$j$的位置,没有就是$m+1$。 设$f[S]$为之前序列的集合为$S$,全员匹配到的最早可行位置,然后枚举最后一位进行转移,若$f[(1<<n)-1]\leq m$则可行。 时间复杂度$O 阅读全文
posted @ 2016-03-06 21:54 Claris 阅读(777) 评论(3) 推荐(2)
摘要: 以根为原点,所有叶子为汇点建立网络。 对于一条边$(x,y,A,B)$,$x$向$y$连边,容量$A$,费用0,再连边,容量$B-A$,费用1。 然后不断增广,直到费用达到$M$为止的最大流即为答案。 考虑用树链剖分+线段树来模拟这个过程: 首先加入所有费用为0的边,每次求出到根距离最小的可增广的叶 阅读全文
posted @ 2016-03-04 23:45 Claris 阅读(565) 评论(1) 推荐(0)
摘要: 从上到下枚举下底边,维护$a[i]$表示$i$向上延伸多少距离里面没有坏点,$b[i]$表示$i$向上延伸多少距离里面最多只有1个坏点。 设$l0[i],r0[i]$表示以$a[i]$为最小值,往左往右能延伸到哪里,$l1[i],r1[i]$表示以$b[i]$为最小值,往左往右能延伸到哪里。 枚举$ 阅读全文
posted @ 2016-03-03 20:41 Claris 阅读(633) 评论(4) 推荐(0)
摘要: 首先答案一定是包含直径某个端点的一个连通块里所有边权值之和,设直径为$AB$,以$A$和$B$分别为根进行处理。 首先按照最长路法则将这棵树进行树链剖分,那么每个叶子的贡献为它与它所在链顶端的点的距离。 将叶子按贡献从大到小排序,并求出$h[x]$表示$x$子树内叶子排名的最小值。 对于询问$(x, 阅读全文
posted @ 2016-02-29 23:09 Claris 阅读(577) 评论(0) 推荐(0)
摘要: 考虑从左往右填数,维护当前数字权值与$A$权值的差值,如果差值大于9,那么以后无论怎么填,都不会改变大小关系。 所以设$f[i][j][k]$表示填了前$i$位,差值为$j$,是否卡住$B$上限为$k$的方案数,然后DP即可。 #include<cstdio> #include<cstring> # 阅读全文
posted @ 2016-02-28 17:05 Claris 阅读(355) 评论(0) 推荐(0)
摘要: 将$I$转置,设$G=OI$,则$ans=G^0+G^1+...+G^d$。 注意到$G^d=O(IO)^{d-1}I$,而$IO$是大小为$k\times k$的矩阵,可以通过倍增在$O(k^3\log d)$的时间内求出,然后依次与$O$和$I$的一行一列相乘即可。 时间复杂度$O(nk^2+m 阅读全文
posted @ 2016-02-28 02:38 Claris 阅读(827) 评论(0) 推荐(0)
摘要: 考虑DP,设$f[i][j]$表示考虑了$a[1..i]$和$b[1..j]$的最小代价。 若$a[i]==b[j]$,则$f[i][j]=\min(f[i-1][j],f[i][j-1])+1$。 否则找到最大的$t$,满足$x$和$y$往前$t$个均不相等,此时$f[i][j]=f[i-t-1] 阅读全文
posted @ 2016-02-26 21:03 Claris 阅读(714) 评论(0) 推荐(1)
摘要: 枚举答案长度$L$,设$A$和$B$分别为第一个循环节和反串的第一个循环节。 1.坏点不在$A$,那么可以暴力匹配检验。 2.坏点不在$B$,那么把串翻转后不在$A$中,转化为1。 3.坏点在$A$和$B$的交里面,那么只要长度为$n-L+1$的前后缀相同,那么就存在长度为$L$的循环节。 通过扩展 阅读全文
posted @ 2016-02-20 16:42 Claris 阅读(524) 评论(2) 推荐(0)
摘要: 首先求出区间前$k$大数中奇数的个数和偶数的个数。 如果都是偶数,那么答案就是前$k$大数的和。 否则,要么去掉最小的偶数,加上最大的奇数,要么去掉最小的奇数,加上最大的偶数。 主席树维护即可。 时间复杂度$O((n+m)\log n)$。 #include<cstdio> #include<alg 阅读全文
posted @ 2016-02-19 21:49 Claris 阅读(450) 评论(0) 推荐(0)
上一页 1 ··· 17 18 19 20 21 22 23 24 25 ··· 38 下一页