分治
Cold_Chair
我XXX就是饿死,死外边,从这里跳下去,也不会再做你九条可怜一个测试点
展开
-
【NOIP2017提高A组模拟7.14】紧急撤离
题目大意:给出一个n*m的0,1矩阵(1<=n,m<=500),规定一种规则,从一个点出发,每次只能向下或向右走,不能走1,多组询问(1<=Q<=600000),问是否能从一个点走到另一个点。题解:这题质量很高。 很容易想到这是离线做的。 我们可以对列分治。 假设现在要弄询问的列在[x..y]区间内的,设m=(x+y)/2,把第m列作为连接列。 设fi,j,Sf_{i, j, S}表示(i,原创 2017-07-15 15:50:30 · 598 阅读 · 0 评论 -
【GCJ2009B】Min Perimeter
【GCJ2009B】Min Perimeter:给你一个整数坐标的点集,询问点集中最小的三角形周长是多少。退化的三角形也是允许的(面积为0)。 0<n<=1000000<n<=1000000...原创 2018-07-12 16:43:55 · 257 阅读 · 0 评论 -
Codeforces 949E Binary Cards
传送门.题解:观察1: 一个序号x不会选超过一个。假设选了x、x,可以通过选2x、-x替代观察2: 选了序号x,就不会选-x,反过来也成立。假设选了x,-x,可以通过选2x、-x替代*lj样例就是来迷惑人的。接下来怎么办呢?暴力。如果没有奇数,那么肯定不用1或者-1用奇数的话,就枚举1还是-1,继续递归这个过程。记得去重,这样的复杂度是T(n)=2∗...原创 2018-07-05 15:59:26 · 281 阅读 · 0 评论 -
【NOI2018模拟4.3】paint
Description: 1<=n<=100000题解:有一个非常易证但是不显然的结论。答案矩形一定过横轴中线或数轴中线。只考虑数轴中线先,横轴中线翻转一下再做就行了。中线把点分成了两个部分。按x排个序,x相同的只取最接近中线的一个。然后扫,建单调栈,正常的暴力的话每次查询是单调栈的长度的复杂度。但是可以离散+线段树。线段树存的是以这个坐标为左边界,往上下的最长长度,便于统计,还要减去一个横坐标。原创 2018-04-15 20:00:11 · 303 阅读 · 0 评论 -
【NOI2018模拟3.10】子序列
Description:题解:好把我竟然打了lj的题解方法。代码长常数大。大概就是用个优先队列来维护。每次提出最小的。考虑两种转移: 1.在它后面加个最小的。2.把它的最后一个删掉,找个次小的。第一种转移预处理。可以用主席树来维护第二种转移。比较大小的话就用trie上倍增。Code:#pragma G++ optimize (2)#include<map>#include<queue>#in原创 2018-03-14 12:25:57 · 315 阅读 · 0 评论 -
【2012中山市选】最大立方体空间(二维线段树)
Description:给出一个长方体的箱子,还有在箱子里面的N个长方体的盒子,箱子和盒子的各个边都是平行于某个三维坐标轴。现在要求你找出其中最大的立方体空间,输出它的长度。首先这个空间必须位于箱子里面,而且不能与其它的盒子占的空间冲突。这个空间也必须是各边平行于某个坐标轴。0<=N<=10000<=xi<=Xi<=L<=10000<=yi<=Yi<=W<=10000<=zi<=Zi<=H<=100原创 2018-01-20 22:30:13 · 468 阅读 · 0 评论 -
【WC2016模拟】String
Description:题解:一眼就是在后缀树上乱搞。仔细思考可以用dsu on tree+线段树来维护,常数巨小。nilil说用后缀数组+Cdq分治+线段树。大概是这样: 对于一个区间[x..y],设m=(x+y)/2那要求跨过m的两个点的答案。可以设l,r。l往左边扫过去,得到一个到终点的height的min值。同时r往右边调。使r到m的height的min值小于等于l的。反着做一遍。r往右边原创 2017-12-30 07:13:14 · 514 阅读 · 0 评论 -
【清华集训2017模拟】Sequence
Description : 1<=n<=3e4,1<=m<=1e5题解:做的第一道整体二分题。整体二分的套路: 二分一个答案,对于每个询问求出答案,再把询问分成两部分,第一个部分是答案< mid的,第二个部分是答案大于mid的,至于=mid的,这个询问不一定是mid,先把答案记一下,根据实际情况而决定分到哪个部分。这题首先得把[x, y]的限制具体化,用一棵主席树预处理[x..y]限制对应的a值原创 2017-08-18 22:05:41 · 618 阅读 · 0 评论 -
【NOIP2013模拟联考7】最长上升子序列
Description:维护一个序列,使它可以进行下面两种操作: 1.在末尾添加一个数字x 2.将整个序列变成第x次操作后的样子 在每次操作后,输出当前序列的最长上升子序列的长度 序列初始时为空. n<=500000且所有输入的数字都是长整型范围内的非负整数题解:显然可以离散一下数字直接套用可持久化线段树,区间查询,单点修改。 也可以设fif_i表示长度为i的最小结尾,接着强行可持久化线原创 2017-11-25 16:42:06 · 656 阅读 · 0 评论 -
【NOIP2017提高A组模拟10.8】Star Way To Heaven(欧几里得距离最小生成树Prim做法)
Description: k<=6000,n,m<=10^6题解:直接想找到这样一条路径是很难的。可以考虑二分答案r,对k个star都建一个半径为r的圆,那么对于两个相交的圆把它们弄到一个集合,对上下边界特殊判断,如果说上下边界被弄到了一个集合,即说明,有若干个圆将矩形拦腰折断,分成了两个不连通的部分,则这个答案不合法。其实也可以对n个点进行欧几里得距离最小生成树,当然,边界特盼,什么时候上下边界原创 2017-10-25 20:02:36 · 2313 阅读 · 0 评论 -
【NOIP2017提高A组模拟10.8】Lost My Music
Description: 1<=n<=5∗1055*10^5题解:由于本人太弱,不会什么斜率优化,所以只能这样做了: 设答案为Ans。cv−cudis(u,v)<=ans{c_v-c_u\over dis(u,v)}<=anscv−cudepu−depv<=ans{c_v-c_u\over dep_u-dep_v}<=anscv−cu<=ans∗(depu−depv)c_v-c_u<=ans*(原创 2017-10-25 20:26:57 · 531 阅读 · 0 评论 -
【NOIP2017提高A组冲刺11.4】Genocide
Description:题解:先思考50分的做法。 显然是拆式子,把和i有关的划到一边,和j有关的划到一边,中间有个-ij,维护一个交点递减的单调栈,直接做就好了(斜率优化什么的我不会)。100分的做法比较坑爹。 对于x,首先预处理不选它的最大值,用50分的做法前后做两遍就行了。还要求出一定选它的最大值,这就比较玄乎了。关于区间的,可以yy出分治。对于区间[x..y],设 m = x +y/ 2原创 2017-11-06 19:33:38 · 295 阅读 · 0 评论 -
51nod 1686 第K大区间
Description:定义一个区间的值为其众数出现的次数。 现给出n个数,求将所有区间的值排序后,第K大的值为多少。 1<=n<=100000, k<=n*(n-1)/2。题解:这道题是从大到小排序,题目没说。发现答案是单调的,所以尝试二分答案。 二分出答案Mid后,我们是可以O(n)扫一遍来得出值大于等于Mid的区间有多少个的。 具体的话,从左往右扫,对于当前的第i个位置,找到值和a[i原创 2017-09-08 20:37:19 · 377 阅读 · 0 评论 -
【GDOI2017模拟9.21】妮厨的愤怒
题目大意:给出一个长度为n的字符串S,Q个询问,每次给出l,r,求S的第l位到第r位的最长回文子串。 (1<=n,Q<=10^5)题解:记得以前做过一道很像的题。 是YJL的题,二维RMQ,对于每一个查询也是二分答案。不说了,首先添加特殊字符,manacher求出r。 对于每一个询问,二分答案,于是我们得到了可能的回文中心的范围,RMQ查询区间最大值,判一下即可。Code:#include<c原创 2017-09-08 20:28:46 · 451 阅读 · 0 评论 -
【NOIP2017模拟A组模拟8.5】序列问题
Description: 1<=n<=500000题解:这种题马上想到的就是分治。对于区间[x..y],将它分成三部分: m = (x +y)/2 1.左右端点都在[x..m]里的。 2.左右端点都在[m + 1..y]里的。 3.左右端点在m的两旁。前两个递归处理,考虑第三个怎么求,这是分治的常规套路。先考虑区间[m + 1..y](右区间),以m+1为左端点,从左往右枚举右端点,min原创 2017-08-05 21:03:27 · 649 阅读 · 0 评论 -
JZOJ 100023 【NOIP2016提高A组模拟7.6】塔
题目大意:小A想搭一个体积不超过m的塔,他有各种大小的立方积木,比如边长为a的积木,体积为a^3,现在小A需要你给一个X,每次小A会用一个体积不超过X的最大积木,依次到搭好为止,现在他想最大化积木的个数,同时在积木个数最大的情况下使X最大。 1<=n<=10^15吹水:不能确定这题是什么算法,姑且算它为分治吧,感觉质量挺高的,没有做过类似的题。题解:设f(m)=max(Ans(1..m))f(m)原创 2017-07-06 20:55:26 · 642 阅读 · 0 评论 -
Codeforces 983E NN country
传送门先考虑树是一条链怎么做?最最最最经典的做法就是倍增。设fi,xf_{i,x}fi,x表示从x出发,用2^i的条路径,最远能够走到哪里。首先预处理f0,xf_{0,x}f0,x,这个相当于把一段区间的f取max。假设有一路径[x…y],那么要对[x…y]的f取max(fi,y)max(f_i,y)max(fi,y),但是由于fif_{i}fi的初值为i,所以也可以说是对[x…...原创 2018-10-20 16:36:44 · 404 阅读 · 0 评论