随笔分类 -  高效算法思想--分治

摘要:$n \leq 300000$的一个排列,每次能交换相邻两个数,并且有一次机会交换不相邻的两个数,可以不用这个机会。问使这个排列升序最少操作几次。 如果没有“不相邻”,那就是当年入门的时候学的逆序对了。也就是说,这次机会希望把逆序对数尽可能减少。把排列变成点放在二维平面上,$(i,a_i)$,可以发 阅读全文
posted @ 2018-07-12 08:55 Blue233333 阅读(569) 评论(0) 推荐(0)
摘要:$n \leq 1e6$个区间,定义一个区间集合的权值为:并集大小-交集大小。求一个权值最大的大小至少为2的集合。 好题。 在一个区间集合中,可以发现除了左右端点涉及的区间外,里面剩余的区间越少,并集不会变但交集会越大,因此答案会更优。但我们需要集合大小至少为2,因此变成选两个区间。 左右端点可能涉 阅读全文
posted @ 2018-05-23 14:09 Blue233333 阅读(345) 评论(0) 推荐(0)
摘要:cdq时,注意横坐标相等的情况,以及横坐标是否为0。--Blue233333 阅读全文
posted @ 2018-04-09 16:33 Blue233333 阅读(134) 评论(0) 推荐(0)
该文被密码保护。
posted @ 2018-03-31 10:03 Blue233333 阅读(3) 评论(0) 推荐(0)
摘要:$n \leq 50000$的凸多边形,给一个三角剖分,$q \leq 100000$组询问每次问两点之间最短路。 凸多边形是个特殊的图,一般图找单源最短路已经有精美的算法了。然而多组询问呢? 其实关于路径统计、路径询问的问题,在树上常用的是点分治,每次能统计经过根节点的路径,然后再尽量把他分成较大 阅读全文
posted @ 2018-03-12 06:47 Blue233333 阅读(521) 评论(0) 推荐(0)
该文被密码保护。
posted @ 2018-02-17 19:26 Blue233333 阅读(3) 评论(0) 推荐(0)
摘要:n<=500,n*n的矩阵,m<=60000个询问每次问子矩阵第K小。 方法一:第K小什么的是可以二分的,那就整体二分套二维树状数组吧! 这里有一个细节优化,本来整体二分是logMax的嘛,可以先把数字排个序,就变成logn了。这是没优化的后果(话说3个log确实极卡) 方法二:分块,n*n个数字从 阅读全文
posted @ 2018-01-08 08:39 Blue233333 阅读(181) 评论(0) 推荐(0)
摘要:n<=50000个vector进行m<=50000次操作:1、一区间的vector插入一个数;2、查询一区间中的vector中的所有数的第k大。 方法一:普通线段树套权值线段树!…… 方法二:单个询问是可以二分的,那就整体二分吧。这次是用线段树维护,把所有数字反过来求第k小再反过来就是第k大,注意5 阅读全文
posted @ 2018-01-08 07:36 Blue233333 阅读(179) 评论(0) 推荐(0)
摘要:n<=10000个数有m<=10000个操作,1、询问一个区间的第k小的数;2、单点修改。 带修主席树。 整体二分。 整体二分的必要条件: 1 #include<string.h> 2 #include<stdlib.h> 3 #include<stdio.h> 4 //#include<asser 阅读全文
posted @ 2018-01-07 21:24 Blue233333 阅读(271) 评论(0) 推荐(0)
摘要:n<=100000个数有m<=5000个询问,每次问区间第k大。 方法一:主席树!…… 方法二:整体二分。 整体二分一次性计算半个值域对一个区间的询问的贡献,然后根据“这半边的贡献在某个询问中可不可以直接处理掉”把询问分两部分,并按“数字的值是否在这半边”把数字也分成两部分,这样把一个区间和值域都分 阅读全文
posted @ 2018-01-05 11:28 Blue233333 阅读(198) 评论(0) 推荐(0)
摘要:n<=200000个平面上的点,问有多少对点(i,j)满足Xi<Xj,Yi<Yj,且不存在k使得Xi<Xk<Xj && Yi<Yk<Yj。保证Xi,Yi互不相同。 看起来像一个偏序问题,先按Xi排序然后分治来做,但是那坨长长的东西怎么搞呢?试了若干种方法,不会,看题解。 首先Y这一维是要满足的,所以 阅读全文
posted @ 2017-11-27 18:31 Blue233333 阅读(342) 评论(3) 推荐(0)
摘要:对w*w,w<=2000000的矩形,一开始全是0(或一开始全是s),n<=170000个操作,每次操作:矩阵内某点加上一个数,查某一个子矩阵的和,保证修改数<=160000,询问数<=10000。 这还是一个比较明显的三维偏序:时间维,以及x和y。由于现在时间维是一个Ti<Tj,而x和y是要查x1 阅读全文
posted @ 2017-11-24 13:43 Blue233333 阅读(170) 评论(0) 推荐(0)
摘要:n<=100000个人,每个人三个属性Ai,Bi,Ci,一个人i的等级为Ai>=Aj,Bi>=Bj,Ci>=Cj的人数,求每个等级有多少人。 裸的三维偏序。按照常规思路,一维排序,一维归并,一维利用单调性或用树状数组维护,这里选择后者。 先按Ai排序,然后在分治过程中,solve(l,mid),so 阅读全文
posted @ 2017-11-23 19:52 Blue233333 阅读(184) 评论(0) 推荐(0)
摘要:n<=100000天,一开始有s块钱,每天股票A价格ai,B价格bi,每天可以做的事情:卖出股票;按A:B=RTi的比例买入股票。问最后的最大收益。股票可以为浮点数,答案保留三位。 用脚指头想想就知道是:某一天全部买进来,某一天全部卖出去,没有说买一半卖一半的。 那就可以dp了,f(i)表示前i天最 阅读全文
posted @ 2017-11-22 21:28 Blue233333 阅读(172) 评论(0) 推荐(0)
摘要:n<=100000栋楼房,第i栋在位置i,一开始全没建成高度0,m<=1e5个操作,每次操作把一栋楼x的高度修改为y,并问这次修改后从0位置往右边看能看到多少栋楼。他能看到一栋楼,必须这栋楼有高度,并且设楼高度Hi,那么(0,0)到(i,Hi)这条线段上没有其他的楼。1<=y<=1e9 说半天就是维 阅读全文
posted @ 2017-10-18 19:51 Blue233333 阅读(234) 评论(0) 推荐(0)
摘要:n<=1e5个点的树有边权,m个询问,每次问max dis(i,j) a<=i<=b,c<=j<=d。 结论:一个区间的最远点对,要么是其左半区间的最远点对,要么是其右半区间的最远点对,要么是左右半区间最远点对的四个点的互相组合之一。如下图: 两个集合最远点对分别是A-B,A并B的最远点对是红A-蓝 阅读全文
posted @ 2017-10-10 22:08 Blue233333 阅读(438) 评论(0) 推荐(0)
摘要:n<=10000个点,求欧几里德距离最小的一对点。 经典分治,把这些点按x排序,分成两半,每边分别算答案,答案是左边的最小,右边的最小,左右组起来的最小三者的最小。发现只有左右组的有点难写。 假设左右两半各自的最小中的最小是d,左半边最右的点横坐标是X1,右半边最左的点的横坐标是X2。那么只需要坐标 阅读全文
posted @ 2017-10-10 16:49 Blue233333 阅读(456) 评论(0) 推荐(0)