题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3262 题目大意:中文题目 具体思路:CDQ可以处理的问题,一共有三维空间,对于第一维我们直接按照从小到大排序就可以了,然后就开始处理第二维,第二维的话我们通过cdq来维护,然后第三维通过树状数组维护就可以了. 刚开始做CDQ的问题,个人觉得CDQ处理的就是把一整个大的问题转换成多个子问题进行求解,然后很重要的一个的地方就是解决前面一个子问题对后面的问题的影响. AC代码: #inclu…
[bzoj3262]陌上花开 Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当且仅当Sa>=Sb,Ca>=Cb,Ma>=Mb.显然,两朵花可能有同样的属性.需要统计出评出每个等级的花的数量. Input 第一行为N,K (1 <= N <= 100,000, 1 <= K <= 200,000 ), 分别表示花的数…
http://acm.hdu.edu.cn/showproblem.php?pid=5618 题意:…… 思路:和NEUOJ那题一样的.重新写了遍理解了一下,算作处理三维偏序的模板了. #include <cstdio> #include <algorithm> #include <iostream> #include <cstring> using namespace std; #define INF 0x3f3f3f3f #define N 100010…
[bzoj3295][Cqoi2011]动态逆序对 2014年6月17日4,7954 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序对数. Input 输入第一行包含两个整数n和m,即初始元素的个数和删除的元素个数.以下n行每行包含一个1到n之间的正整数,即初始排列.以下m行每行一个正整数,依次为每次删除的元素. Output 输出包含m行…
大早上的做了一道三维数点一道五位数点,神清气爽! 先给一维排序,变成一个奇怪的动态的二维数点(相当于有一个扫描面扫过去,导致一系列的加点和询问) 然后cdq分治,再变回静态,考虑前半段对后半段的影响 这时对第二维排序,又变成动态一维数点 树状数组屠之 (不妨再cdq一次变成零维数点,也就是询问一个询问之前有几次修改)(手动滑稽) 另外因为x y z都相同时互相产生影响,特判掉 来上个又臭又长的代码 #include <bits/stdc++.h> using namespace std; st…
题目大意: 题面传送门 三维偏序裸题 首先,把三元组关于$a_{i}$排序 然后开始$CDQ$分治,回溯后按$b_{i}$排序 现在要处理左侧对右侧的影响了,显然现在左侧三元组的$a_{i}$都小于等于右侧 而$c_{i}$这一维需要用权值树状数组维护 归并排序时,已知左侧右侧两个指针分别是$i,j$ 如果$b_{i} \leq bj$,将左侧已经遍历过的三元组的$c_{i}$推入树状数组,然后$i++$ 如果$b_{i}>bj$,那么右侧能取到的贡献就是树状数组内$\leq c_{j}$的三元…
题目大意: 洛谷传送门 这明明是一道KD-Tree,CDQ分治是TLE的做法 化简式子,$|x1-x2|-|y1-y2|=(x1+y1)-(x2+y2)$ 而$CDQ$分治只能解决$x1 \leq x2,y1 \leq y2$的情况 把每次插入操作都相当于一个三元组$<x,y,t>$,权值是$x+y$.这就是一个三维偏序问题,用树状数组维护最大值即可 所以通过坐标变换,跑$4$次$CDQ$就行了? 没错,你会像我一样T得飞起 #include <cstdio> #include &…
题目大意: 洛谷传送门 三维偏序裸题.. 每次操作都看成一个三元组$<x,y,t>$,表示$x,y$坐标和操作时间$t $ 询问操作拆成$4$个容斥 接下来就是$CDQ$了,外层按t排序,回溯时按$x$排序,用树状数组处理$y$这一维即可 #include <vector> #include <cstdio> #include <cstring> #include <algorithm> #define N1 201000 #define M1…
题目大意:略 洛谷传送门 和 [CQOI2015]动态逆序对 这道题一样的思路 一开始的序列视为$n$次插入操作 把每次交换操作看成四次操作,删除$x$,删除$y$,加入$x$,加入$y$ 把每次操作都看成一个三元组 $<x,w,t>$ 操作位置,权值,以及操作时间 变成了一道三维偏序裸题 外层按操作时间$t$升序,回溯时按操作位置$x$排序 处理左区间对右区间的影响时,正反两次树状数组求逆序对即可 #include <vector> #include <cstdio>…
题目大意: 题面传送门 还是一道三维偏序题 每次操作都可以看成这样一个三元组 $<x,w,t>$ ,操作的位置,权值,修改时间 一开始的序列看成n次插入操作 我们先求出不删除时的逆序对总数量,再统计每次删除元素时,减少的逆序对数量 然后就是三维偏序裸题了吧,第一维时间,第二维操作位置,第三维权值,用树状数组维护即可 由于逆序对可以在被删除元素的前面或者后面,所以在归并时需要正反遍历各统计一次 #include <vector> #include <cstdio> #in…