cdq分治
WerKeyTom_FTD
我是一只来自中山纪念中学高三的oier,请多多指教
展开
-
[bzoj3110]K大数查询
题目大意现在有N个盒子,初始为空。有M个操作,每个操作要么为编号范围在l~r的盒子都放入一个球上面的数为a,要么是询问编号范围在l~r的盒子所有球上的数的第k大值。 n,m<=50000离线大法好是不是很容易想到树套树? 我们这题是可以用整体二分或cdq分治的(我并不能分清它们) 具体做法如下: 用solve(l,r,S)表示现在处理S集合,S集合是操作集合按照时间排序,所有插入操作满足插入原创 2016-02-24 18:53:58 · 1030 阅读 · 0 评论 -
Sequence
题目大意有两个序列a和b。 每次询问将一个区间a值排名在[x,y]的中找一个b值第k小。做法用主席树将排名的x和y变成具体的值。 接下来可以根据b整体二分,其余部分可以拆区间+扫描线+数据结构完成。#pragma GCC optimize(2)#include<cstdio>#include<algorithm>#define fo(i,a,b) for(i=a;i<=b;i++)usi原创 2017-08-17 19:20:58 · 450 阅读 · 0 评论 -
看无可看
题目大意一个序列a[i]。 选择任意k个位置,记和为S。 为答案贡献f(S)。 f是类斐波那契数列,对于i>1它满足f(i)=2*f(i-1)+3*f(i-2)。做法这是个常系数线性齐次递推。 对于本题M(x)=x^2-2x-3。 定义(a,b)=ax+b,那么可以重载乘法(乘法在模M(x)意义下): (a,b)*(c,d)=(bc+ad+2ac,bd+3ac) 对于每个a[i]初始可原创 2017-06-13 15:13:32 · 648 阅读 · 0 评论 -
摧毁图状树
题目大意Q次询问,每次给一个k。 将树用尽量少的长度不超过k的祖先后代链覆盖,使得每个点至少覆盖一次。贪心对偶成选择尽量多的点,使得任意长度不超过k的祖先后代链上至多一个点被选择。 这样转化则贪心很显然。尽量选深度大的点。 如果有t个叶子,选取的点至多为t+(n-t)/k。 因为叶子一定会被选择,同样删去所有被选择的点后,每个联通块大小不会小于k(否则一定在原来的树中存在长度不超过k的祖先后原创 2017-06-28 19:24:21 · 724 阅读 · 0 评论 -
[bzoj3711]Druzyny
题目描述体育课上,n个小朋友排成一行(从1到n编号),老师想把他们分成若干组,每一组都包含编号连续的一段小朋友,每个小朋友属于且仅属于一个组。 第i个小朋友希望它所在的组的人数不多于d[i],不少于c[i],否则他就会不满意。 在所有小朋友都满意的前提下,求可以分成的组的数目的最大值,以及有多少种分组方案能达到最大值。神题我们考虑DP。 f[i]表示将前i个人分组的最大值,-1表示不可能,g[原创 2017-05-26 16:55:35 · 920 阅读 · 0 评论 -
查询
题目描述给出若干条线段,用(x1,y1),(x2,y2)表示其两端点坐标,现在要求支持两种操作: 0 x1 y1 x2 y2 表示加入一条新的线段,(x1,y1)-(x2,y2) 1 x0 询问所有线段中,x坐标在x0处的最高点的y坐标是什么,如果对应位置没有线段,则输出0。分治考虑CDQ分治,问题转化为先做0操作再做1操作。 按照横坐标建线段树,在一个线段树节点上线段可当直线用。 维护原创 2017-04-06 09:34:32 · 463 阅读 · 0 评论 -
稻草人
题目描述YLOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典。 有一次,YLOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地。和启示中的一样,田地需要满足以下条件: 1、田地的形状是边平行于坐标轴的长方形; 2、左下角和右上角各有一个稻草人; 3、田地的内部(不包括边界)没有稻草人。 给出每个稻草人的坐标,请你求出有多少遵从启示的田地的个数分治按x坐标原创 2017-01-12 20:57:11 · 632 阅读 · 0 评论 -
[bzoj4700]适者
题目描述敌方有n台人形兵器,每台的攻击力为Ai,护甲值为Di。我方只有一台人形兵器,攻击力为ATK。战斗看作回合制, 每回合进程如下: ·1 我方选择对方某台人形兵器并攻击,令其护甲值减少ATK, 若护甲值<0则被破坏。 ·2 敌方每台未被破坏的人形兵器攻击我方基地造成Ai点损失。 但是,在第一回合开始之前,某两台敌方的人形兵器被干掉了(秒杀)。问最好情况下,我方基地会受到多少点损原创 2017-01-15 22:35:31 · 893 阅读 · 0 评论 -
与运算
题目大意对于一个a序列,定义si表示a1~i做and运算。 将a重排来最大化s的总和。DP我们把s一样的记为一块 设Fi表示一个s值为i的块放最前面,最大的总和。 显然我们要把所有与i做and等于i的塞进最前面那块里面,还需要预处理gi表示多少aj and i=i。这个是经典分治。 每次枚举下一块的值j转移,注意i and j=j,所以能塞进第一块的之前被塞进了第二块。 如果我们认为可以有原创 2017-01-15 16:56:45 · 559 阅读 · 0 评论 -
最大值
题目大意给定一个序列,求ai opt aj(i<ji<j)的最大值。 opt是and/or/xorxor一个数一个数插入进trie中每次查找一发 n log nand和or从高位向低位贪心 尽量使高位位运算后结果为1 我们可以枚举一个数作为必须在位运算中出现的数,然后找到一个数与其位运算结果最大。 假如是and的话,对于某一位,该数此位为1,则另一个数如果该位也能为1就强制该位是1,否则不原创 2016-10-31 15:19:59 · 503 阅读 · 0 评论 -
Dash speed
题目大意一颗树,每条边有边权[l,r]。 多次询问每次给定一个权值v,保留树上所有的边[l,r]使得l<=v且v<=r,然后求这片森林的最长简单路径长度。经典CDQ考虑分治算法 把每条边插入线段树区间中 然后一个权值的答案就是加入根到其对应叶子路径上经过的线段树节点上的所有边。 然后对线段树进行遍历,用并查集维护集合内的直径。因为要支持撤销,所以只能按秩合并不能路径压缩。 然后我跑的贼慢。原创 2016-11-05 16:15:22 · 730 阅读 · 0 评论 -
Walk
题目描述在比特镇一共有n 个街区,编号依次为1 到n,它们之间通过若干条单向道路连接。比特镇的交通系统极具特色,除了m 条单向道路之外,每个街区还有一个编码vali,不同街区可能拥有相同的编码。如果val_i and val_j = val_j,即val_i 在二进制下与val_j 做与运算等于val_j,那么也会存在一条额外的从i 出发到j 的单向道路。Byteasar 现在位于1 号街区,他想知原创 2016-11-04 16:25:35 · 618 阅读 · 0 评论 -
graph
题目大意维护一个图,若干操作每次加入一条边或删除一条已有边,每次操作后都输出该图是否为二分图。CDQ预处理每条边的存在时间。 考虑一个时刻,此时存在的边是所有存在时间区间包含该时刻的。对于每个时刻做的话,就是把所有包含该时刻的时间区间对应边加入并查集。 现在考虑把所有时刻一起做。 solve(l,r)表示解决[l,r]所有询问,先把所有时间区间刚好为[l,r]的加入并查集,对于剩余边,要么分到原创 2016-09-18 21:41:36 · 495 阅读 · 0 评论 -
Jason跳格子
前言富榄好强啊 !题目大意f[i]=max(f[j]+1)其中jCDQ分治明显的,我们可以CDQ分治。 对于solve(l,r),先递归处理solve(l,mid),然后我们用[l,mid]更新[mid+1,r]。我们可以按照a排序来做,b用线段树维护,当然排序有第二关键字那就是编号。 常数有点大,可以加个优化:线段树在查询时一个区间最大值为0直接返回0。#include<cstdio>#in原创 2016-07-14 10:22:59 · 769 阅读 · 0 评论 -
[bzoj4553][TJOI&HEOI2016]序列
题目大意有一个长度为n的序列,有一些位置的值有可能变化。 一次变化最多只会改变一个位置上的值,题目告诉了你可能发生的变化情况。 求在任意可能情况下都能满足非降的最长子序列长度。DP先弄出偏序关系,设mi[i]表示位置i可能出现的最小值,mx[i]就是最大值。 那么对于j<ij<i,j与i可以在一个合法子序列中的条件是: 1、a[j]<=mi[i] 2、mx[j]<=a[i] 设f[i]表原创 2016-05-11 19:36:08 · 1607 阅读 · 3 评论 -
整体二分及cdq分治题库
关于整体二分及cdq分治算法的一些题目原创 2016-02-24 18:55:25 · 1402 阅读 · 0 评论 -
ZOO
题目大意M个询问询问区间K小值。整体二分我们用K大数查询这道题的思路整体二分。 这道题直接套用K大数查询需要带两个log。 我们把询问l~r拆为两个询问1~r和1~l-1,那么每个询问都变成一个前缀,于是我们想着搞一波线性作法。 观察到对于答案区间为l~r,我们只需要扫描在这个区间内的数。 也就是说对于l~r中的数,<=mid的数继续归到左区间其余归到右区间。 一个区间内的询问按照右端点排原创 2016-02-25 18:32:09 · 1309 阅读 · 0 评论 -
[arc066f]Contest with Drinks Hard
题目大意有一些物品,每个买了有代价。 如果存在一个极大区间[l,r]内的物品都被买了,这个区间长度为k,可以获得的收益是k*(k+1)/2。 现在若干次询问,每次问假如修改了某个物品的价格,最大收益是多少?DP先处理出L和R分别表示前缀dp值和后缀dp值,显然dp可以用决策单调性优化。 然后现在我们需要求出一定买某个物品的最大值,记为ans[]。 也就是说假设买了区间[l,r],那么[l,r原创 2017-11-16 14:40:31 · 1009 阅读 · 0 评论