03 2016 档案

摘要:首先要将这个图连通,方法是通过扫描线+set求出每个连通块最高的点上方的第一条边,然后向交点连边。 然后把边拆成两条双向边,每次找到一条没走过的边,找到极角排序后它的反向边的后继,直到回到这条边。 根据叉积可以求出面积,如果面积非负,那么就说明找到了一个封闭区域。 然后再进行一次扫描线,找到一个点上 阅读全文
posted @ 2016-03-30 01:00 Claris 阅读(522) 评论(0) 推荐(0) 编辑
摘要:(i,1)对答案的贡献为liC(2ni2,ni)an1bni(1,i)对答案的贡献为tiC(2ni2,ni)anibn1(i,j)c对答案的贡献为cC(2nij,ni)anjbnic 阅读全文
posted @ 2016-03-22 22:26 Claris 阅读(968) 评论(0) 推荐(1) 编辑
摘要:首先将坐标离散化,因为区间互不包含,可以理解为对于每个起点输出最少需要多少个战士。 将环倍长,破环成链,设f[i]表示区间左端点不超过i时右端点的最大值,可以通过O(n)递推求出。 那么如果将f[i]看成i的祖先的话,它实际上形成了一棵以2n为根的树。 首先暴力计算出1号点的 阅读全文
posted @ 2016-03-21 23:48 Claris 阅读(1397) 评论(0) 推荐(0) 编辑
摘要:最大流=最小割,而因为本题点的度数不超过3,所以最小割不超过3,EK算法的复杂度为O(n+m)。 通过分治求出最小割树,设f[i][j][k]表示最小割为i时,j点在第k次分治过程中是否与S连通,h[i][j]f[i][j][k]的hash值,那么如果$h[k][i 阅读全文
posted @ 2016-03-20 03:02 Claris 阅读(812) 评论(0) 推荐(0) 编辑
摘要:二分答案,没有出现过的时刻没有用,可以进行离散化。 首先如果某个时刻出现多个人数,那么肯定矛盾。 然后按时间依次考虑,维护: t:剩余可选人数。 s:现在必定有的人数。 cl:往左延伸的人数。 cr:往右延伸的人数。 如果现在有人必须加入,那么优先踢掉cl的人。 如果当前人多了, 阅读全文
posted @ 2016-03-19 03:05 Claris 阅读(555) 评论(0) 推荐(0) 编辑
摘要:首先如果一段连续子序列里没有任何幸运数,那么显然可以缩成一个点。 设幸运数个数为m,那么现在序列长度是O(m)的,考虑暴力枚举R1,然后从右往左枚举L1。 每次碰到一个幸运数,就将它删去,维护出被删的数它左边右边连续能到的位置,然后用组合数计算贡献。 考虑给每个被删数字一个删除时 阅读全文
posted @ 2016-03-18 23:11 Claris 阅读(379) 评论(0) 推荐(0) 编辑
摘要:如果一个区间包含另一个区间,那么这两个区间是否在一起的生产率是一样的。 将所有这种包含了其他区间的区间放入数组b,其余的放入数组c,有多个相同的时候则从b移一个到c。 那么c里所有区间左端点递增,右端点也递增,设f[i][j]c中前j个区间划分成i组的最大收益, 阅读全文
posted @ 2016-03-18 17:14 Claris 阅读(812) 评论(0) 推荐(0) 编辑
摘要:最小值肯定是把树看作二分图,此时答案为n1。 最大值一定是选取重心为根,任意一个子树要么全部指向根,要么全部背离根,这样可以制造最大的星型图。 统计出每个子树的大小后做01背包,如果小于n,那么二进制拆分,否则这种子树不超过n个,直接DP即可。 用bitse 阅读全文
posted @ 2016-03-17 21:10 Claris 阅读(667) 评论(0) 推荐(0) 编辑
摘要:暴力搜索出所有可行的形状,可以发现本质不同的形状数只有6000个左右。 对于每个形状,它的大小不超过8×8,故可以按照右下角为原点重建坐标系,用一个unsigned long long来存储。 然后对于每个中心,先进行第一步扩展,若能成功扩展,则扫描所有形状,看看是否匹配即可。 时间 阅读全文
posted @ 2016-03-17 19:35 Claris 阅读(368) 评论(0) 推荐(0) 编辑
摘要:设f[i]为最优策略下调试i行代码的时间,则: f[1]=0 f[i]=min((j1)×p+f[ij])+r 意义为枚举printf语句的个数,然后尽量均分,并假设坏点在最大的段落里。 考虑记忆化搜索,注意到对于每个i阅读全文
posted @ 2016-03-17 01:24 Claris 阅读(491) 评论(0) 推荐(0) 编辑
摘要:最多只有一个连通块大小大于nk,所以用hash表进行BFS的时候只扩展nk步即可。 时间复杂度O(n2k)阅读全文
posted @ 2016-03-16 18:04 Claris 阅读(481) 评论(0) 推荐(0) 编辑
摘要:枚举左端点i,那么可行的右端点j的最小值单调不下降,可以通过双指针求出,检验可以通过在后缀数组里检查相邻height值做到O(1)。 那么左端点为i,右端点在[j,n],它对前面一段的贡献为定值,对后面一段的贡献为等差数列,线段树维护即可。 时间复杂度O(nlogn)阅读全文
posted @ 2016-03-14 23:32 Claris 阅读(373) 评论(0) 推荐(0) 编辑
摘要:本题就是求重复数最多的字典序最小的runs,如果重复数为1,那么做法显然,然后只考虑重复数大于1的情况。 从小到大枚举长度len,对于每个关键点x=i×len,有且仅有一个长度为len的串经过它。 算出xx+len的最长公共前缀A和最长公共后缀B后,贡献 阅读全文
posted @ 2016-03-14 23:30 Claris 阅读(755) 评论(0) 推荐(1) 编辑
摘要:轮廓线插头DP。 设f[i][j][a][b][c][d][e]表示考虑到了(i,j),轮廓线上3个下插头的位置分别为a,b,c,是否有右插头,已经放了eL的方案数。 然后直接DP即可。 时间复杂度O(nm4)。   阅读全文
posted @ 2016-03-13 18:51 Claris 阅读(643) 评论(0) 推荐(1) 编辑
摘要:将每个点拆成三个点,并将转移转化为矩阵乘法,然后倍增即可求出第k短路的长度,注意对爆long long情况的处理。 时间复杂度O(n3logk)。   阅读全文
posted @ 2016-03-13 02:35 Claris 阅读(730) 评论(0) 推荐(0) 编辑
摘要:求出前缀和s,设f[i]=s[i+d1]s[i1]。 从左到右枚举的右端点i,左端点j满足单调性,若s[i]s[j1]max(f)p,则可行。 用单调队列维护即可,时间复杂度O(n)。   阅读全文
posted @ 2016-03-13 02:34 Claris 阅读(447) 评论(0) 推荐(0) 编辑
摘要:首先只有一种字符的情况可以通过双指针在O(n)的时间内处理完毕。 设cnt[i][j]表示前i个字符中j字符出现的次数,那么对于两个位置j<i: 如果 cnt[i][0]cnt[j][0]cnt[i][1]cnt[j][1] $cnt[i][0]-cnt[j][ 阅读全文
posted @ 2016-03-13 02:33 Claris 阅读(751) 评论(0) 推荐(0) 编辑
摘要:设ab的边权为c的有向边的含义为ba+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 阅读(684) 评论(1) 推荐(0) 编辑
摘要:对于每种颜色,可以发现可以切的位置被分割成了若干段独立的区域。 给每个区域一个编号,将m种颜色的情况当成字符串来看,如果两个切口的字符串完全匹配,那么可以在这里切两刀。 可以构造hash函数,通过差分前缀和做到O(n)修改。 然后对于每一种相同的hash值,将切口按位置从小到大排序,通过组合 阅读全文
posted @ 2016-03-13 02:29 Claris 阅读(800) 评论(0) 推荐(0) 编辑
摘要:设lim=n。 若k<lim,预处理出: F[i][x]x往上走i步到达的点。 S[i][x]x不断往上走i步经过的点的和。 直接O(1)查询即可。 若klim: 查询时用树链剖分划分为O(logn)条重链,在每条重链上暴力 阅读全文
posted @ 2016-03-13 02:28 Claris 阅读(648) 评论(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点的,费用限制j的人数。 然后直接DP即可,时间复杂度O(n3m) 阅读全文
posted @ 2016-03-13 02:26 Claris 阅读(1196) 评论(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 阅读(650) 评论(0) 推荐(0) 编辑
摘要:对于每个询问,设不小于s的个数为cnt,小于s的和为sum。 那么如果可以进行s轮,当且仅当sum(ccnt)×s。 权值线段树维护,时间复杂度O(mlogm)。 证明: 如果cntc,那么显然可以每次取c个。 否则如果$su 阅读全文
posted @ 2016-03-13 02:23 Claris 阅读(730) 评论(0) 推荐(0) 编辑
摘要:详细做法以及证明请看论文《Hamiltonian paths in the square of a tree》。 首先将1到n的路径提取出来,作为主干。 定义毛毛虫为去掉叶子之后只有一条单链的树,定义non-trivial的毛毛虫为单链非空的毛毛虫。 对于主干上每个点,计算它的非主干部分是否是毛毛虫 阅读全文
posted @ 2016-03-12 17:25 Claris 阅读(684) 评论(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 阅读(596) 评论(0) 推荐(1) 编辑
摘要:将分组计划按照k从小到大排序,维护一个单调栈,每个元素为一个矩形,按最底下元素从高到低排列,栈顶最低。 每次加入一个矩形可选区域,维护单调栈,可以往回合并。 然后将所有最低点不满足的矩形取出,合并后放回。 每次考虑栈顶区域,将它取到和下一个矩形底边一致时合并。 可持久化线段树维护,时间复杂度$O 阅读全文
posted @ 2016-03-10 12:08 Claris 阅读(847) 评论(0) 推荐(1) 编辑
摘要:如果两个相邻的串可行,那么它们合并后一定可行,所以求出所有可行的串的个数t,则ans=2t1。 注意特判整个串不可行的情况,这个时候答案为0。 #include<cstdio> int n,m,i,t,ans;char a[300010]; int main(){ for(scanf 阅读全文
posted @ 2016-03-08 20:41 Claris 阅读(215) 评论(0) 推荐(1) 编辑
摘要:找到一棵dfs搜索树,给每条非树边一个随机非0权值,每条树边为所有经过它的树边的权值的异或。 那么有2种情况是合法的: 1.一条边权值为0,一条边权值非0。 2.两条边异或和为0。 排序后统计即可,时间复杂度O(mlogm)。 #include<cstdio> #include<algori 阅读全文
posted @ 2016-03-08 14:05 Claris 阅读(618) 评论(0) 推荐(0) 编辑
摘要:最小的合法串长是O(n2)级别,所以当n>21时无解。 设g[i][j]i后面第一个字符j的位置,没有就是m+1。 设f[S]为之前序列的集合为S,全员匹配到的最早可行位置,然后枚举最后一位进行转移,若f[(1<<n)1]m则可行。 时间复杂度$O 阅读全文
posted @ 2016-03-06 21:54 Claris 阅读(766) 评论(3) 推荐(2) 编辑
摘要:以根为原点,所有叶子为汇点建立网络。 对于一条边(x,y,A,B)xy连边,容量A,费用0,再连边,容量BA,费用1。 然后不断增广,直到费用达到M为止的最大流即为答案。 考虑用树链剖分+线段树来模拟这个过程: 首先加入所有费用为0的边,每次求出到根距离最小的可增广的叶 阅读全文
posted @ 2016-03-04 23:45 Claris 阅读(547) 评论(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 阅读(572) 评论(4) 推荐(0) 编辑

点击右上角即可分享
微信分享提示