分治
文章平均质量分 56
DZYO
Never stop
展开
-
BZOJ3262: 陌上花开(CDQ分治)
传送门题意: n个三元组(a,b,c),求对于每一个ii,aj<=aia_j<=a_i且bj<=bib_j<=b_i且cj<=cic_j<=c_i的jj个数题解: 三维偏序,两位CDQ解决,第三维树状数组即可。#include<bits/stdc++.h>using namespace std;const int Maxn=1e5+50,Maxm=2e5+50;streambuf *ib,原创 2017-09-01 17:53:24 · 316 阅读 · 0 评论 -
NOI模拟:必去之
题解:fi=maxj{min{ai−aj,bi−bj}+fj+1}(j&amp;lt;i,pj&amp;lt;i)f_i = \max_j \{\min \{a_i-a_j,b_i-b_j\}+f_j+1\} (j \lt i, p_j \lt i)fi=jmax{min{ai−aj,bi−bj}+fj+1}(j&lt;i,pj&lt;i)其中aia_iai为没有填的数...原创 2018-09-21 15:55:19 · 512 阅读 · 0 评论 -
BJ模拟:巡游计划(线段树分治+动态凸包 / 李超线段树)
传送门题意: fi=minj=i−ki−1{fj+aj+|pi−pj|∗bj}fi=minj=i−ki−1{fj+aj+|pi−pj|∗bj}f_i = \min_{j=i-k}^{i-1} \{f_j+a_j+|p_i-p_j|*b_j\}求fnfnf_n。题解: 对于kkk的限制,采用线段树分治来解决: 把每个点影响的区间放到线段树上,查询的区间也放到线段树上,保证处理这个区...原创 2018-04-12 23:02:49 · 395 阅读 · 0 评论 -
NOI 模拟:黑暗(多项式求逆+分治FFT)
题意: n 个点的无向图,每条边都可能存在,一个图的权 值是连通块个数的 m 次方,求所有可能的图的权值和。(n≤3e4,m≤15)(n≤3e4,m≤15)(n\le 3e4, m\le 15)题解:用第二类斯特林数消掉nmnmn^m : nm=∑i=1m{mi}(ni)i!nm=∑i=1m{mi}(ni)i!n^m = \sum_{i=1}^m \begin{Bma...原创 2018-03-23 07:30:43 · 912 阅读 · 0 评论 -
BZOJ3711: [PA2014]Druzyny(分治)
传送门题意: 体育课上,n个小朋友排成一行(从1到n编号),老师想把他们分成若干组,每一组都包含编号连续的一段小朋友,每个小朋友属于且仅属于一个组。 第i个小朋友希望它所在的组的人数不多于d[i],不少于c[i],否则他就会不满意。 在所有小朋友都满意的前提下,求可以分成的组的数目的最大值,以及有多少种分组方案能达到最大值。题解: 模拟赛上遇到的。。这道题思路不错。原创 2018-01-14 21:57:56 · 594 阅读 · 0 评论 -
BZOJ2674: Attack(KDTree+线段树/整体二分)
传送门题意: 给许多带点权的点(xi,yi)(x_i,y_i),要求支持交换两点点权或询问矩阵第kk大。题解: 比较直观的做法就是KDTreeKDTree+线段树了,实际上跑得也挺快的。不过这道题有更方便的做法:整体二分。把原点当做加入一个点,交换当做加入一个点并删除一个点,修改间相互独立,而且对答案的贡献是他们的和,那么可以直接上了。#include<bits/stdc++.h>using原创 2017-12-28 07:48:37 · 387 阅读 · 0 评论 -
BZOJ2989: 数列(二进制分组/KDtree+替罪羊)
传送门题意: (稍微转化一下)每次加一些点,在一个正方形内查询点的个数。题解: 先坐标旋转做成矩形查询,然后比较直观的是KDtree+替罪羊暴力重建KDtree+替罪羊暴力重建。 Code:https://paste.ubuntu.com/26306229/还有一种厉害的方法:分治。比较明显的是可以CDQ分治+ 主席树,另外还可以对这些点对做二进制分组。每次暴力重建的复杂度为原创 2018-01-03 21:19:57 · 880 阅读 · 0 评论 -
BZOJ3456:城市规划(EGF+FFT/CDQ分治+FFT)
传送门题意:无向连通图的计数。题解: dalao的题解:http://blog.miskcoo.com/2015/05/bzoj-3456我说说做题时遇到的坑点吧: 1.C(i,2)不能用阶乘逆元来算,因为这样算出来是(modp)\pmod p意义下的,而费马小定理是(modp−1)\pmod {p-1}意义下的。。 2.倍增计算时FFT长度要取22*当前长度,否则计算出来的是循环卷积,详细可原创 2017-11-29 22:42:18 · 749 阅读 · 0 评论 -
NOIP模拟:边的处理(分治)
有一个n个点的无向图,给出m条边,每条边的信息形如<x,y,c,r><x,y,c,r> 给出q组询问形如<u,v,l,r><u,v,l,r> 接下来解释询问以及边的意义。 询问表示,一开始你在点u上,然后按顺序处理编号从11到rr的边。 对于一条边<x,y,c,r><x,y,c,r>,你可以进行两次操作: 1、如果你当前在xx点或者yy点上,那么你可以走这条边(从xx到原创 2017-11-03 20:13:32 · 497 阅读 · 0 评论 -
HDU1007:Quoit Design(分治)
传送门题意: 求平面上的最近点对。题解: 分治。 把当前序列(l,r)分成(l,mid),(mid+1,r)。处理完两边之后保证两边y单调,同时记录全局最优值,考虑合并: 对于左右点只考虑y坐标小于它且距离分治中心不超过全局最优值的,可以证明只有最多4个点。可以看做O(1)O(1),那么总时间复杂度为O(nlogn)O(n\log n) #include<cstdio>#include<原创 2017-10-10 16:21:33 · 510 阅读 · 0 评论 -
BZOJ2716: [Violet 3]天使玩偶(CDQ分治)
传送门题意: 给n个点,每个点出现有先后顺序,求给定位置在给定时间曼哈顿距离最近的点。题解:CDQ分治 感觉自己CDQ写炸了,常数很大。首先拆分成4个区域。 考虑j点对i位置的贡献 首先有tj<tit_j<t_i 1.xj>xi,yj>yix_j>x_i,y_j>y_i,此时贡献为xj+yj−xi−yix_j+y_j-x_i-y_i。使xj+yjx_j+y_j最小。 2.xj>xi,yj原创 2017-09-02 11:23:52 · 1539 阅读 · 0 评论 -
BZOJ3295: [Cqoi2011]动态逆序对(CDQ分治)
传送门题意: 对于序列A,它的逆序对数定义为满足i< j,且Ai>Aj的数对(i,j)的个数。给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序对数。题解: 首先删除看做为逆向加点,记三元组(pos,val,time)(pos,val,time)。那么一个在timeitime_i时刻加入的点i会对所有timeitime_i以后的点产生贡献,这个贡原创 2017-09-01 21:23:43 · 408 阅读 · 0 评论 -
BZOJ1176: [Balkan2007]Mokia(CDQ分治)
传送门题意: 维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=160000,询问数Q<=10000,W<=2000000.题解: 考虑转化,先将查询看成前缀和的查询(左下角的和)。那么对一个查询ii产生影响jj的操作满足ti<tj,xi<=xj,yi<=yjt_i<t_j,x_i<=x_j,y_i<=y_j。经典的三维偏序问题。#incl原创 2017-09-01 19:52:41 · 265 阅读 · 0 评论 -
HDU1166:敌兵布阵(CDQ分治)
传送门题意:单点修改,区间求和题解:当然,线段树或者树状数组或者其他数据结构就是裸题了,其实还有CDQ搞法,空间上直接优化logn。首先区间求和等同于前缀求和,转化为时间上a< b,序列上c< d的二维偏序带权求值。然后就是裸题了。(相当于求逆序对)。#include<bits/stdc++.h>using namespace std;const int Maxn=3e5+50;streambu原创 2017-09-01 15:44:19 · 388 阅读 · 0 评论 -
Topcoder SRM 702 1000pts:FindingFriends(分治)
题解:这道题很妙啊。显然是要二分之后每个位置找到前后第一个合法位置,分别记为Li,RiL_i,R_iLi,Ri,然后要求包含任意一个。这个时候我们只需要找到1∼n1\sim n1∼n中间第一个非法的位置,然后递归下去做就好了,问题是怎么找到这个非法位置。显然这是一个区间内的二维偏序,也就是三维偏序,可以KD树做或者线段树+主席树做,不过复杂度多了一个logn\log nlogn,这时...原创 2018-11-09 11:19:18 · 360 阅读 · 0 评论