摘要: 先按斜率从小到大排序,然后如果排在后面的点B和前面的点A的交点是P,那B会把A在P的右半段覆盖掉,A会把B在P的左半段覆盖掉。 然后如果我们现在又进来了一条线,它跟上一条的交点还在上一条和上上条的左边,这就说明上一条完全被覆盖了 这样的话,维护一个单调栈做一做就可以了 (要先处理一下,斜率相同的只留 阅读全文
posted @ 2018-09-12 12:50 Ressed 阅读(148) 评论(0) 推荐(0) 编辑
摘要: (坑) 漫谈OI中的群论入门 阅读全文
posted @ 2018-09-12 09:51 Ressed 阅读(129) 评论(0) 推荐(0) 编辑
摘要: 设f[i][j]为让前i天发生j次暴动需要改变的最少的值 则f[i][j]=min{f[k][j-1]+(x[k+1]!=0)+(x[k+2]!=1)+...+(x[i]!=(i-k-1))} $O(n^3)$直接做就好了 阅读全文
posted @ 2018-09-11 16:46 Ressed 阅读(188) 评论(0) 推荐(0) 编辑
摘要: https://www.nowcoder.com/acm/contest/172/C (sbw大佬太强啦 orz) 先把每一个路径(x,y)分成(x,lca),(y,lca)两个路径,然后就能发现,对于某两个(直上直下的)路径a,b,b的下端点在a的下端点子树中,且b的上端点深度<=a的上端点深度, 阅读全文
posted @ 2018-09-11 16:37 Ressed 阅读(195) 评论(0) 推荐(0) 编辑
摘要: 二分一下答案,假设是x。 我们把大于x的看成1,小于x的看成-1,等于x的看成0 那某个区间的和如果是正的,就说明这个区间中位数大于x;如果是0,就等于x;如果是负的,就小于x; 这样的话,做一个前缀和,然后维护一下满足长度>=len的最小值,然后减一减,看看是不是>=0就可以了。 (我自己写的话我 阅读全文
posted @ 2018-09-10 22:17 Ressed 阅读(281) 评论(0) 推荐(0) 编辑
摘要: 首先二分一个答案x,然后我们把>=x的数看成1,<x的数看成0,那如果最后剩下1,这个答案就是合法的。 那我们就来算让某一位得1至少需要填几个1(设这个值是f[i]) i=1..n时,显然,如果i已经固定,f[i]=0或inf(取决于原来是1还是0);如果i还没有固定,那f[i]=1 然后每次就可以 阅读全文
posted @ 2018-09-10 22:12 Ressed 阅读(682) 评论(6) 推荐(6) 编辑
摘要: 对于某个靴子,如果0代表某个格能走,1代表不能走,那么只要连续的1的个数的最大值>=靴子的步长,那这个靴子就不能用。 那么只要对靴子和格子都按深度排个序,然后从大到小来扫一遍(靴子越来越浅,能走的格子就越来越少,也就是相当于在增加1的个数),现在只要能维护把0变成1后,连续的1个数的最大值就行了 用 阅读全文
posted @ 2018-09-08 20:59 Ressed 阅读(216) 评论(0) 推荐(0) 编辑
摘要: 题意:给一个树状的文件结构,让你求从某个文件夹出发访问到所有文件,访问路径字符串长度之和的最小值,其中,访问父节点用..表示,两级之间用/分割 做两次dfs,第一次算DownN[x]和DownS[x],分别代表从x/访问到它子树中的文件个数和长度之和 第二次算UpN[x]和UpS[x],分别代表从x 阅读全文
posted @ 2018-09-08 20:49 Ressed 阅读(285) 评论(0) 推荐(0) 编辑
摘要: 平面图转对偶图:先在原图中加一个s->t的边,然后对每个面建一个点,对每条分隔两个面的边加一条连接这两个面对应点的边,边权等于原边权。 然后从刚才加的s->t分割出来的两面对应的两个点跑最短路,求出来的就是s到t的最小割。 要特判n==0||m==0的情况 然后我特判的那个点就T了一万次,在抄eli 阅读全文
posted @ 2018-09-07 13:18 Ressed 阅读(192) 评论(0) 推荐(0) 编辑
摘要: 新建一个N+1的点,飞出去的连到这个上,记size,每次统计x和N+1的链长就可以。 别忘了编号是从0开始的 阅读全文
posted @ 2018-09-07 11:00 Ressed 阅读(208) 评论(0) 推荐(0) 编辑