题目链接 考虑对于两个点a,b,距离为|x[a]-x[b]|+|y[a]-y[b]|,如果a在b的右上,那我们可以把绝对值去掉,即x[a]+y[a]-(x[b]+y[b]). 即我们要求满足x[b]<=x[a]且y[b]<=y[a]的最大的x[b]+y[b],用CDQ分治+树状数组解决. 那如果a不在b的右上呢?可以通过坐标变换解决(因为要求的只是相对距离). 坐标变换可以用Xmax或Ymax减去xi或yi. 如果还用之前的方法,每次变换坐标前都要把操作序列变为初始序列(时间有序),但是这样很…
题目链接 KD-Tree.因为插入过多点后可能会退化成链,所以左/右子树sz > α*整棵子树sz时对整棵子树进行重构. 树的节点数必须是3n?why?洛谷,BZOJ都这样..(数据范围错了吧 和SYJ摆棋子一样n=5e5→_→) 但是n=5e5为什么仍要3倍空间(重构的话)..迷. 吊打CDQ. [Upd] 为啥我以前写不怎么加fread.. //65280kb 14368ms #include <cstdio> #include <cctype> #include <…
[BZOJ2716] [Violet 3]天使玩偶(CDQ分治) 题面 Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里,所以她决定仅凭一点模糊的记忆来寻找它. 我们把 Ayu 生活的小镇看作一个二维平面坐标系,而 Ayu 会不定时地记起可能在某个点 (xmy) 埋下了天使玩偶:或者 Ayu 会询问你,假如她在 (x,y) ,那么她离近的天使玩偶可能埋下的地方有多远. 因为 Ayu 只会沿着平行坐标轴的方向来行动,所以…
先cdq分治, 然后要处理点对答案的贡献, 可以以询问点为中心分成4个区域, 然后去掉绝对值(4种情况讨论), 用BIT维护就行了. -------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<cctype>   using namespace std;   #def…
原题 已知n个点有天使玩偶,有m次操作: 操作1:想起来某个位置有一个天使玩偶 操作2:询问离当前点最近的天使玩偶的曼哈顿距离 显然的CDQ问题,三维分别为时间,x轴,y轴. 但是这道题的问题在于最近距离怎么维护. 曼哈顿距离定义为|x2-x1|+|y2-y1|,所以把绝对值展开后一共有四种情况: \(x2-x1+y2-y1 => x2+y2-(x1+y1) x1-x2+y2-y1 => -x2+y2+(x1-y1) x2-x1+y1-y2 => x2-y2+(y1-x1) x1-x2+…
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2716 怎么KD树跑得都那么快啊..我写的CDQ分治被暴虐 做四遍CDQ分治,每次求一个左下角\(x_i+y_i\)的最大值 第一种写法是一开始按时间排序,然后CDQ分治的时候改成按\(x\)坐标排序,同时用树状数组统计每个\(y\)坐标的最大值 第二种写法是一开始按\(x\)坐标排序,然后CDQ分支的时候改成按时间排序 CDQ分治好神奇(琦)... 一定要注意树状数组如果没有元素不能…
题目大意:初始给定平面上的一个点集.提供两种操作: 1.将一个点增加点集 2.查询距离一个点最小的曼哈顿距离 K-D树是啥...不会写... 我仅仅会CDQ分治 对于一个询问,查询的点与这个点的位置关系有四种,我们如今仅仅讨论左下角,剩余三个象限同理 设询问的点为(x,y),查询的点为(x',y') 则dis=(x-x')+(y-y')=(x+y)-(x'+y') 于是我们要找到查询的点左下方全部点中x'+y'最大的点.x值排序,y值维护树状数组就可以 用CDQ分治化在线为离线.保证x有序就可以…
还是照着CDQ的思路来. 但是有一些改动: 要求4个方向的,但是可爱的CDQ分治只能求在自己一个角落方向上的.怎么办?旋转!做4次就好了. 统计的不是和,而是——max!理由如下: 设当前点是(x,y),目标点是(x',y'),那么所求的|x-x'|+|y-y'|首先用旋转大法化为x-x'+y-y',然后我们发现这个东西其实就是x+y-x'-y'=(x+y)-(x'+y'),而x+y我们是已知的.所以我们求一下max(x'+y')即可.具体实现是对树状数组魔改. 然后交上去发现狂T不止... 疯…
题目链接:传送门 关于CDQ分治(参考李煜东<算法竞赛进阶指南>): 对于一系列操作,其中的任何一个询问操作,其结果必然等价于:初始值 + 此前所有的修改操作产生的影响. 假设共有 $m$ 次操作,对于任意的满足 $1 \le l \le r \le m$ 的正整数 $l,r$,定义 $solve(l,r)$ 为:对于任意的正整数 $k \in [l,r]$,若第 $k$ 次操作为询问操作,则计算第 $l \sim k-1$ 次操作中的修改操作对第 $k$ 次查询的影响.$solve(l,r)…
这道好(du)题(liu)还是很不错的 挺锻炼代码能力和不断优化 卡常的能力的. 对于 每次询问 我都可以将其分出方向 然后 写 也就是针对于4个方向 左下 左上 右下 右上 这样的话 就成功转换了问题 求4次 三维偏序即可 水题啊. 然后 打完代码 就提交 T飞了 //#include<bits/stdc++.h> #include<iostream> #include<iomanip> #include<ctime> #include<cstdio…
Luogu 3810 & BZOJ 3263 陌上花开/三维偏序 | CDQ分治 题面 \(n\)个元素,每个元素有三个值:\(a_i\), \(b_i\) 和 \(c_i\).定义一个元素的偏序是三个值都小于等于它的值的元素的个数,对于\([0, n)\)的每个值\(i\),求偏序为\(i\)的元素个数. 题解 这道题我使用的是CDQ分治. 这道题有三个维度,每个维度都要对应一个数据结构/算法,来逐个击破. 首先,按照\(a\)从小到大把所有元素排序,保证\(a\)从小到大. 然后,对于第二维…
BZOJ 3295 动态逆序对 这道题和三维偏序很类似.某个元素加入后产生的贡献 = time更小.pos更小.val更大的元素个数 + time更小.pos更大.val更小的元素个数. 分别用类似CDQ分治求三维偏序的方法求即可. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; #define space putch…
2244: [SDOI2011]拦截导弹 Time Limit: 30 Sec  Memory Limit: 512 MBSec  Special JudgeSubmit: 237  Solved: 103[Submit][Status][Discuss] Description 某 国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度.并且能够拦截任意速度的导 弹,但是以后每一发炮弹都不能高于前一发的高度,其拦截的导弹的飞行速度…
4025: 二分图 题意:加入边,删除边,查询当前图是否为二分图 本来想练lct,然后发现了线段树分治的做法,感觉好厉害. lct做法的核心就是维护删除时间的最大生成树 首先口胡一个分块做法,和hnoi2016第一题类似的偏序关系,一样做. 线段树分治 数据结构题中如果使用对时间cdq分治,要求每个操作独立,不能很好的处理撤销(删除)操作. 采取线段树区间标记的思想 对于一个操作,它的存在时间是\([l,r]\) 我们模仿线段树打标记的过程进行分治,\(cdq(l,r,S)\)表示当前处理时间\…
传送门 题意:不想写... 扔链接就跑 好吧我回来了 首先发现每次兑换一定是全部兑换,因为你兑换说明有利可图,是为了后面的某一天两种卷的汇率差别明显而兑换 那么一定拿全利啊,一定比多天的组合好 $f[i]$表示第$i$天最多能得到的钱在这一天可以换成多少$A$卷 枚举使用哪一天留下的卷,按这一天的汇率换成钱来更新最大钱数 再用这个钱数更新$f[i]$ 这样是$O(n^2)$的 #include <iostream> #include <cstdio> #include <al…
BZOJ2683: 简单题(CDQ分治 + 树状数组) 题意: 你有一个\(N*N\)的棋盘,每个格子内有一个整数,初始时的时候全部为\(0\),现在需要维护两种操作: 命令 参数限制 内容 \(1\ x\ y\ A\) \(1\le x,y \le N\),A是正整数 将格子\(x,y\)里的数字加上\(A\) \(2\ x1\ y1\ x2\ y2\) \(1\le x1\le x2\le N,1\le y1\le y2\le N\) 输出\(x1\ y1\ x2\ y2\)这个矩形内的数字…
http://acm.hdu.edu.cn/showproblem.php?pid=3842 写的check函数里写的<但是应该是<=,调了一下午,我是个zz. 就是普通的斜率优化因为有两层需要排序的所以一层sort一层cdq分治 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespa…
题目链接 dp进阶之CDQ分治优化dp. 前置技能:dp基本功底,CDQ分治,树状数组. 问题等价于求二维最长上升子序列,是一个三维偏序问题(时间也算一维). 设$dp[i]=(l,x)$为以第i枚导弹结尾的最优状态,$l$代表最长上升子序列长度,$x$代表长度为l的最长上升子序列数量,则$(l_0,x_0)$比$(l_1,x_1)$更优当且仅当$l_0>l_1$或($l_0=l_1$且$x_0>x_1$).(实际上在转移的过程中,第二个条件没什么用) 根据题意有状态转移公式:$dp[i]=\…
题目大意:太长了略 splay调了两天一直WA弃疗了 首先,我们可以猜一个贪心,如果买/卖,就一定都买/卖掉,否则不买/卖 反正货币的行情都是已知的,没有任何风险,所以肯定要选择最最最优的方案了 容易得到方程 $dp[i]=max(dp[i-1],a[i]*\frac{dp[j]*rate[j]}{rate[j]*a[j]+b[j]}+b[i]*\frac{dp[j]}{rate[j]*a[j]+b[j]})$ 显然是要用凸优化了 splay非常无脑,splay维护此题的凸包,需要找前驱,删前驱…
做这道题真的是涨姿势了,一般的CDQ分治都是在序列上进行的,这次是把CDQ分治放树上跑了~ 考虑一半的 CDQ 分治怎么进行: 递归处理左区间,处理左区间对右区间的影响,然后再递归处理右区间. 所以,如果是有坐标不递增的斜率优化的话就用 CDQ 分治先处理出左半部分答案,然后将处理好的左区间答案用来更新右区间. 那么,将序列问题拓展到树上后,我们也要选择一个合适的中点来保证分治层数不多,且区间大小均匀. 而树中这个"中点"就是一棵树的重心!! 即当我们处理以 $x$ 为根的子树时(分治…
题目传送门 题解: 对整个修改的区间进行分治.对于当前修改区间来说,我们对整幅图中将要修改的边权都先改成-inf,跑一遍最小生成树,然后对于一条树边并且他的权值不为-inf,那么这条边一定就是树边了.然后我们把这些点都缩成一个点.然后,我们继续对当前修改区间来说,我们把要修改的边的边权都修改成inf,跑一遍最小生成树,然后对于一条非树边来说,他的边权不为inf,那么这条边一点是非树边了,然后我们每层缩点,减边,这样图就会越来越小,然后当l == r的时候,我们还原修改操作,最后把跑最小生成树计算…
题意 略- 分析 就是求最长不上升子序列,坐标取一下反就是求最长不下降子序列,比较大小是二维(h,v)(h,v)(h,v)的比较.我们不看概率,先看第一问怎么求最长不降子序列.设f[i]f[i]f[i]表示以iii结尾的最长不降子序列的长度,有f[i]=max(f[j]+1) ( 0≤j<i,hj≤hi,vj≤vi )f[i]=max(f[j]+1)\ (\ 0\le j<i,h_j\le h_i,v_j\le v_i\ )f[i]=max(f[j]+1) ( 0≤j<i,hj​≤hi​…
传送门 题意:三维最长不上升子序列以及每个元素出现在最长不上升子序列的概率 $1A$了好开心 首先需要从左右各求一遍,长度就是$F[0][i]+F[1][i]-1$,次数就是$G[0][i]*G[1][i]$ 我们可以用一些转换来简化代码 反转之后变成$LIS$,然后再反转并且$x,y$取反还是$LIS$,写一遍就可以啦 然后本题的树状数组需要维护最大值以及最大值的数量,还有一个时间戳 #include <iostream> #include <cstdio> #include &…
考虑答案的构成,发现是一个有限制条件的偏序问题. 然后三个维度的DP,可以排序.CDQ.树状数组各解决一维. #include <map> #include <cmath> #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define F(…
三维偏序,直接CDQ硬上. 正反两次CDQ统计结尾的方案数,最后统计即可. #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define F(i,j,k) for (int i=j;i<=k;++i) #define D(i,j,k) for (int i=j;i>=i;--i) #define…
W过大,很难在线维护,考虑离线算法 给每个操作加一个时间属性n,显然,对于n=i的询问,对它有影响的修改只在n<i中,所以可以CDQ(因为是按时间序读进来的,所以不用排序了 对于统计矩形和,可以使用二维前缀和的思想,即只需要统计四个点即可 这样就转化成了三维偏序问题,只是询问和修改要分开处理. (初始值不用管,输出的时候加上就行 #include<iostream> #include<cstdio> #include<algorithm> using namesp…
偏序问题: https://www.luogu.org/blog/Owencodeisking/post-xue-xi-bi-ji-cdq-fen-zhi-hu-zheng-ti-er-fen 优质题目: https://oi.men.ci/tag/cdq/ 看思想: https://www.cnblogs.com/MyNameIsPc/p/9297296.html https://www.cnblogs.com/mlystdcall/p/6219421.html 三维偏序 维度a,b,c [m…
[题目链接] http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=29234 [题意] 询问当前点与已知点的最小曼哈顿距离. [思路] CDQ分治 Dist(A,B)=|A.x-B.x|+|A.y-B.y|.假设B处于A点的左下方,则有dist=(A.x+A.y)-(B.x+B.y),然后发现这个就与刚做过的 Mokia 比较相似,只不过是求和变成了求取最大罢了,依然可以对x用cdq分治使升序,对y用树状数组维护统计. 再考虑其…
 KD-tree可做,但是我不会暂时不考虑 大意:在二维平面内,给定n个点,m个操作.操作A:加入一个点:操作B:询问一个点与平面上加入的点的最近距离 不封装会T不封装会T不封装会T不封装会T不封装会T不封装会T不封装会T不封装会T不封装会T不封装会T不封装会T 把初始存在的点也看成加点操作 首先,曼哈顿距离取绝对值很烦,所以我们可以通过转坐标,把左上 右上 左下 右下通过转坐标都变成左下,最后取个min即可.于是对于(x,y)左下的点(x1,y1),dis=x-x1+y-y1=(x+y)-(x…
题目描述 Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里,所以她决定仅凭一点模糊的记忆来寻找它. 我们把 Ayu 生活的小镇看作一个二维平面坐标系,而 Ayu 会不定时地记起可能在某个点 (xmy) 埋下了天使玩偶:或者 Ayu 会询问你,假如她在 (x,y) ,那么她离近的天使玩偶可能埋下的地方有多远. 因为 Ayu 只会沿着平行坐标轴的方向来行动,所以在这个问题里我们定义两个点之间的距离为dist(A,B)=|A…