cdq分治/整体二分
文章平均质量分 50
Clove_unique
All that you have lost can be won back bit by bit as long as you wish for it.
展开
-
[BZOJ1176][Balkan2007]Mokia(cdq分治+bit)
题目描述传送门 S不用管它…题解cdq分治板子题T_T 感觉所有讲cdq分治的资料都是“从cash谈起”,然而我感觉这题比较裸,可以先做这道题明白了cdq是干什么的再去想那些神dp感觉cdq分治的做法就是将一个区间(l,r)分成(l,mid)和(mid+1,r),然后处理(l,mid)对(mid+1,r)的影响,然后递归处理(l,mid)和(mid+1,r) 关键就是如何处理(l,mid)对(原创 2017-01-08 17:24:54 · 530 阅读 · 0 评论 -
[BZOJ2726][SDOI2012]任务安排(斜率优化dp+cdq分治)
题目描述传送门题解哈哈哈速度实力倒数第一 也不知为什么写的奇慢无比卡常数卡到丧心病狂才勉强过了 我分明是把sort都搞成归并了呀…这题是dp+cdq分治好题啊首先考虑最裸的dp怎么搞 f(i)表示前i个搞完的最小花费… 等等,时间有后效性…记录一下时间? 瞬间爆炸 实际上我们可以发现,只要知道一共划分成了几部分,就能通过T的前缀和以及s计算出时间,所以令f(i,j)原创 2017-03-26 22:49:05 · 1305 阅读 · 0 评论 -
[BZOJ2244][SDOI2011]拦截导弹(dp+cdq分治)
题目描述传送门题解这题真tm麻烦 其实dp是很简单的,令f(i)表示以i为结尾的最长非升子序列长度,g(i)表示以i结尾的最长非升子序列的方案数,h(i)和k(i)分别表示以i为开头的 然后对于每一个i,判断f(i)+h(i)-1是否就是最长答案;如果是,那么g(i)*k(i)就是这个点出现的次数 dp的过程用两个cdq做一下就行,实际上就是一个三维偏序,按照时间分治,每次按照横坐标排序,然后原创 2017-03-26 21:45:48 · 1183 阅读 · 0 评论 -
[BZOJ3963][WF2011]MachineWorks(斜率优化dp+cdq分治)
题目描述传送门题解首先考虑如何暴力dp 肯定是先按照D(i)排序对吧 令f(i)表示在第D(i)天卖掉手里有的机器所能得到的最大收入 那么有一个很显然的dp方程:f(i)=max{f(i-1),max{f(j)-P(j)+G(j)*(D(i)-D(j)-1)+R(j)}}(1<=j<=i-1) 只考虑后半部分,实际上就变成了f(i)=max{f(j)-P(j)+G(j)*(D(i)-D(j)原创 2017-03-26 21:38:50 · 952 阅读 · 0 评论 -
[BZOJ3939][Usaco2015 Feb]Cow Hopscotch(cdq分治)
题目描述传送门题解把一个一个的点都拆开 按横坐标分治,每一次按纵坐标排序,然后搞一个数组统计一下标号就行了 因为这里的横坐标是严格小于,所以分治的时候要保证左右两个区间不能有x相同的点 sort太慢了,都改成了归并排序的版本,时间是O(nlogn)O(nlogn)的代码#include<algorithm>#include<iostream>#include<cstring>#inclu原创 2017-03-26 07:33:12 · 674 阅读 · 0 评论 -
[BZOJ1492][NOI2007]货币兑换Cash(斜率优化dp+cdq分治)
题目描述传送门题解首先可以发现,每一天的决策一定是全部买入或者全部卖出,因为只要有利益一定最大限度地取,如果有亏损就一点不碰 然后需要说的是,每一天所有的钱数可以唯一地转化为一种A券和B券的方案,也就是说,不用管某一天手里是有钱还是有券,反正都是等价的 令f(i)表示第i天的最大收益,显然f(0)=s 假设第i天手里有xi张A券,yi张B券,那么相对应地,第i天手里的钱就是f(i)=xi*Ai原创 2017-03-25 21:26:08 · 614 阅读 · 0 评论 -
[BZOJ4237]稻草人(cdq分治+单调栈+二分)
题目描述传送门题解对x排序了之后按照x分治,每一次对y排序 考虑如何处理左区间里的点对右边的点的影响,也就是如何计算左边和右边配对的情况 用两个指针扫的时候,如果左边的连续一段区间里的点想要都和右边的某一个点配对的话,必须满足x单调递减 而右边的区间的某一个点如果要是想和左边的点配对的话,只能是y在 它和第一个x在它左边的点 所确定的y的范围内的点 对于左边的点维护一个x单调递减的栈,对右边原创 2017-03-24 21:59:51 · 811 阅读 · 0 评论 -
[BZOJ2253][2010 Beijing wc]纸箱堆叠(dp+bit+cdq分治)
题目描述传送门题解最长上升子序列+三维偏序问题 裸的dp人人会对吧O(n2)O(n^2) 考虑对序列进行cdq分治,每一次用左边的区间来更新右边的区间 按照x分治,每一次按照y排序,然后z用树状数组查询 需要注意的是,这里全部都是严格大于,也就是说分治的时候划分到左右两边的点不能出现x相等的情况,这样的话就预处理一下然后在选中点的时候搞一搞就行了 并且更新的顺序必须是:递归左区间,处理左区原创 2017-03-24 21:47:46 · 809 阅读 · 0 评论 -
[BZOJ3295][Cqoi2011]动态逆序对(树状数组套线段树||cdq分治)
总有一天 能让这欢喜的歌声传到你身边原创 2016-04-28 14:10:29 · 950 阅读 · 0 评论 -
[BZOJ2216][Poi2011]Lightning Conductor(dp+决策单调性)
题解传送门题解移项p≥aj+|i−j|−−−−−√−aip\ge a_j+\sqrt{|i-j|}-a_i 正着做一遍反着做一遍然后就可以把绝对值啥的去掉了 以正着做为例 p≥aj+i−j−−−−√+aip\ge a_j+\sqrt {i-j}+a_i 实际上如果令f(i)=max{aj+i−j−−−−√}−aif(i)=max\{a_j+\sqrt{i-j}\}-a_i,就是要求f(i)m原创 2017-02-26 11:22:47 · 985 阅读 · 0 评论 -
[BZOJ2683]简单题(cdq分治)
题目描述传送门题解同BZOJ1176代码#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;#define N 1000005int n,T,cnt,x,y,p,q,v,opt,acnt,bcnt,pa,pb,tot;int C[原创 2017-02-10 16:50:51 · 671 阅读 · 0 评论 -
[BZOJ2674]Attack(整体二分+树状数组套线段树)
题目描述传送门 数据有坑: 给出的不一定是左下角和右上角,需要自己判断交换。题解没见过整体二分里面还有个树套树的… 首先把坐标离散 感觉是K大数查询和矩阵乘法两道题的结合版,就是动态求矩阵的k大值 用bit套线段树的原因是没法写二维bit,于是线段树动态开点 把初始的矩阵和SWAP操作都看做修改,QUERY看成查询 二分第k大的数是mid,做权值小于等于mid的修改,查询的时候如果总数原创 2017-01-10 21:57:56 · 1310 阅读 · 0 评论 -
[BZOJ2223][Coci 2009]PATULJCI(整体二分+bit)
题目描述传送门题解以前好像做过一样的题,可持久化权值线段树裸题对吧… 整体二分的话也不难想 首先需要找单调性,乍一看是没有单调性的 不过,如果当前二分的答案为mid,这个区间里所有小于等于mid的数都不够的话,mid就一定变大,反之相反 那么每一次就把小于等于mid的数都加到bit里,然后判断二分的方向就可以了 需要注意的一点是,最后当l=r时就不能再加小于等于mid的数了,必须要加入严格原创 2017-01-10 11:30:29 · 682 阅读 · 0 评论 -
[BZOJ2738]矩阵乘法(整体二分+二维bit)
题目描述传送门题解首先把权值离散 将所有的点看成是单个插入操作,所有的询问看成是查询操作 二分第k小的数mid,将插入操作按照权值排序了之后就是在一段区间里 将<=mid的数加入到bit里,然后对于每一个询问在bit中查询 如果不够的话就往大的走,如果小的话就往小的走 注意如果向mid,r走的话要将k减去当前的答案代码#include<algorithm>#include<iostrea原创 2017-01-10 11:25:47 · 613 阅读 · 0 评论 -
[BZOJ2527][Poi2011]Meteors(整体二分+bit)
题目描述传送门题解整体二分最少是哪个流星雨 每一次处理(l,mid)之间的修改然后再判断每一个询问是否满足 线段树的常数太大了…必须用bit才能过…代码#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;#define LL l原创 2017-01-09 21:59:41 · 534 阅读 · 0 评论 -
[BZOJ3110][Zjoi2013]K大数查询(主席树套线段树||整体二分 )
仿佛将那些年幼时的记忆全部唤起的声音已经被那温柔的笑脸 拯救过多少次原创 2016-04-28 09:57:18 · 982 阅读 · 0 评论 -
[BZOJ2716][Violet 3]天使玩偶(cdq分治+bit)
题目描述传送门题解上下左右想想就不好搞啊…所以我们每一次只统计某个点左下方与它最近的,然后做4遍 |x-x’|+|y-y’|=(x+y)-(x’+y’),也就是求x+y最大的点 然后这不就和三维偏序问题差不多了么? 按照时间排序分治,每一次对(l,mid)和(mid+1,r)按照x排序,然后两个指针,对于每一个询问将横坐标都小于等于它的点按照y加入bit,权值为x+y,查询最大值然而写完了之后原创 2017-01-08 17:40:51 · 3696 阅读 · 0 评论 -
[BZOJ3262]陌上花开(cdq分治+bit)
题目描述传送门题解三维偏序问题? 首先按照x第一关键字,y第二关键字,z第三关键字排序,然后问题就转化成了求某一个(x,y,z)前面存在多少个(x’,y’,z)满足x>=x’,y>=y’,z>=z’ 由于x一定是有序的,那么根据x进行cdq分治 每一次将(l,mid)和(mid+1,r)分别根据y排序(x不一定有序),然后两个指针扫一下,查询之前把z小于等于它的都插入到bit中 这样做完了之原创 2017-01-08 17:33:05 · 1766 阅读 · 0 评论 -
[BZOJ4430][Nwerc2015]Guessing Camels赌骆驼(cdq分治+bit||bit)
题目描述传送门题目大意:给出三个1~n的排列,求有多少个数对,在这三个排列中的相对位置相同。题解处理出每一个数在三个排列中的位置,就形成了n个三维点对 然后就是一个三维偏序问题了,用cdq分治+bit求解做完之后发现有一个更厉害的只用bit的方法 考虑容斥,答案=总数-不符合条件的对数 然后又知道不符合条件的点对一定是在两个排列里相对位置相同,在一个中和另外两个不同,那么两两统计三个排列,相当原创 2017-04-06 19:28:02 · 821 阅读 · 0 评论