CDQ分治 陌上花开(三维偏序)】的更多相关文章

为了反驳隔壁很对劲的太刀流,并不对劲的片手流决定与之针锋相对,先一步发表cdq分治解三维偏序. 很对劲的太刀流在这里->  参照一.二维偏序的方法,会发现一位偏序就是直接排序,可以看成通过排序使第一维无效.二维偏序是排序+树状数组,就是先通过排序消除了第一维的影响,再通过树状数组进行统计.那么以此类推,三位偏序应该就是树套树状数组…啊不对,是先通过排序消除第一维的影响,再通过[某种方法]消除第二维的影响,再用树状数组统计. 传说中的[某种方法]就是cdq分治,它是一种通过计算前一半对后一半的影响…
问题背景 在三维坐标系中有n个点,坐标为(xi,yi,zi). 定义一个点A比一个点B小,当且仅当xA<=xB,yA<=yB,zA<=zB.问对于每个点,有多少个点比它小.(n<=1e5) 其实就是离散数学里的偏序的概念啦,只不过是到了三维.回顾一下偏序的概念: 偏序关系:自反,反对称且传递,符号< 然后先考虑一下二维偏序吧.可以用最长上升子序列LIS来做,然后我们今天讨论一种特殊分治的做法,这种算法是由08年集训队的陈丹琦提出来的,因此叫cdq分治. 主要思想就是先按照第一…
cdq是何许人也?请参看这篇:https://wenku.baidu.com/view/3b913556fd0a79563d1e7245.html. 在这篇论文中,cdq提出了对修改/询问型问题(Modify-Query问题)的分治做法,下面来具体讨论一下: 我们将修改/询问看作在时间轴上的一系列元素,把修改和询问统称为“操作”,并用记号\([l,r]\)表示第\(l\)个操作到第\(r\)个操作的序列. 在时间轴上进行的操作,众所周知有这样的特性:时间早的会影响时间晚的,而反过来不会,这就是c…
题意:给n(n<=100000)个点,坐标为(xi,yi,zi)(1<=xi,yi,zi<=100000),定义一个点A比一个点B小,当且仅当xA<=xB,yA<=yB,zA<=zB.求对于每个点,有多少个点比它小. 分析: 首先肯定按照x递增顺序排个序 接下来就是每次往平面插入一个点,求这个点左下方已经有多少个点,这可以用二维树状数组来搞,但是很明显会爆空间,不可以接受(当然树套树也是不可以的) 可以考虑对第二维cdq分治 对于一个区间[l,r],先递归区间[l,mi…
#include <iostream> #include <stdio.h> #include <algorithm> using namespace std; const int maxn=1e5+10; const int maxk=2e5+10; int n,k; struct Triple { int a,b,c,cnt,ans; }a[maxn],A[maxn]; bool cmp(const Triple &a,const Triple &b…
Given a sequence of N pairs of integers, find the length of the longest increasing subsequence of it. An increasing sequence A1..An is a sequence such that for every i < j, Ai < Aj. A subsequence of a sequence is a sequence that appears in the same…
Luogu 3810 & BZOJ 3263 陌上花开/三维偏序 | CDQ分治 题面 \(n\)个元素,每个元素有三个值:\(a_i\), \(b_i\) 和 \(c_i\).定义一个元素的偏序是三个值都小于等于它的值的元素的个数,对于\([0, n)\)的每个值\(i\),求偏序为\(i\)的元素个数. 题解 这道题我使用的是CDQ分治. 这道题有三个维度,每个维度都要对应一个数据结构/算法,来逐个击破. 首先,按照\(a\)从小到大把所有元素排序,保证\(a\)从小到大. 然后,对于第二维…
CDQ分治-陌上花开 题目大意 对于给遗传给定的序列: \[ (x,y,z)_1, (x,y,z)_2, (x,y,z)_3, \cdots, (x,y,z)_n \] 求: \[ \sum_{x_i < x_j,~y_i < y_j,~z_i<z_j,~i ≠j}1 \] 题解: CDQ分治,顾名思义就是要进行分治,但是它可以解决比普通分治更多的问题.CDQ分治的整体思想,是: 对于一个需要解决问题的区间\([l,r)\),将其一分为二,变为\([l,mid),[mid,r)\). 对…
HDU4742 CDQ分治,三维LIS 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4742 题意: 每个球都有三个属性值x,y,z,要求最长的lis的长度和方案数 题解: 一维LIS很好求,dp一下就行 二维的LIS,将第一维排序后,和第一维一样 那么三维的lis怎么做了,我们很容易想到将第一维排序后分治的写,分了后, 按照y排序,怎么治呢?用树状数组更新前前x的最大值,然后再用dp更新即可 这里需要注意,和陌上花开等板子题不一样,我们这里不能分…
题目链接:https://vjudge.net/problem/HYSBZ-3262 3262: 陌上花开 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 3188  Solved: 1472[Submit][Status][Discuss] Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),用三个整数表示. 现在要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量. 定义一朵花A比另一朵花B要美丽,当且…
三维偏序裸题,cdq分治时,左侧的x一定比右侧x小,然后分别按y排序,对于左侧元素按y大小把z依次插入到树状数组里,其中维护每个左侧元素对右侧元素的贡献,在bit查询即可 /************************************************************** Problem: 3262 User: walfy Language: C++ Result: Accepted Time:3844 ms Memory:28640 kb **************…
CDQ分治或树套树可以切掉 CDQ框架: 先分 计算左边对右边的贡献 再和 所以这个题可以一维排序,二维CDQ,三维树状数组统计 CDQ代码 # include <stdio.h> # include <stdlib.h> # include <iostream> # include <algorithm> # include <string.h> # define IL inline # define RG register # define…
Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),用三个整数表示. 现在要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量. 定义一朵花A比另一朵花B要美丽,当且仅Sa>=Sb,Ca>=Cb,Ma>=Mb. 显然,两朵花可能有同样的属性.需要统计出评出每个等级的花的数量. Input 第一行为N,K (1 <= N <= 100,000, 1 <= K <= 200,000 ), 分别表示花的数量和最大属性值. 以下N…
题目大意: 题面传送门 三维偏序裸题 首先,把三元组关于$a_{i}$排序 然后开始$CDQ$分治,回溯后按$b_{i}$排序 现在要处理左侧对右侧的影响了,显然现在左侧三元组的$a_{i}$都小于等于右侧 而$c_{i}$这一维需要用权值树状数组维护 归并排序时,已知左侧右侧两个指针分别是$i,j$ 如果$b_{i} \leq bj$,将左侧已经遍历过的三元组的$c_{i}$推入树状数组,然后$i++$ 如果$b_{i}>bj$,那么右侧能取到的贡献就是树状数组内$\leq c_{j}$的三元…
本来几天前就该记录的东西,硬生生被我拖到了现在,太懒了... 在cdq学习时,二维偏序已经解决了,无非就是先sort使第一维有序,然后再用cdq或者数据结构处理第二维.而三维偏序的时候呢,大佬的做法好像有树套树之类的,但是我不会,所以我选择cdq. 大体的思路很简单,首先也是先使第一维有序,然后cdq把第二维由小到大合并,这时再套个线段树或者树状数组处理第三维.来几题做一下 BZOJ1935园丁的烦恼 题目大意:一个花园里有n棵数,然后有m次询问,每次询问一个矩形里有多少颗树. 把原有的树视为更…
排序,三关键字 去重 归并排序+树状数组 #include<bits/stdc++.h> using namespace std; #define re register int const int N=100010; const int M=200010; int n,m; struct node{ int a,b,c,s,res; bool operator < (node y) const { if(a==y.a&&b==y.b)return c<y.c; i…
一个下午的光阴之死,凶手是细节与手残. 致命的一枪:BIT存权值时: for(; x <= maxx; x += x&-x) t[x] += w; //for(; x <= n; x += x&-x) t[x] += w;// You died int n; int maxx; struct Element{ int a,b,c; long long ans; int siz; bool operator< (const Element &com)const{ i…
由于有归并排序 要注意是对原来的那个元素进行更新答案和删除操作 而不是占据原来那个元素下标的元素…
http://www.lydsy.com/JudgeOnline/problem.php?id=3295 题意:简单明了. 思路:终于好像有点明白CDQ分治处理三维偏序了.把删除操作看作是插入操作,那么可以按照插入的时间顺序看作是一维x,插入的数在原本序列的下标是一维y,插入的数本身是一维z.那么问题可以转化成每插入一个数(xx,yy,zz),求有多少个数(x,y,z)使得 x < xx,y < yy,z > zz .一开始先对 x 进行排序,然后进行CDQ分治.这样可以干掉一维,保证随…
陌上花开 HYSBZ - 3262 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),用三个整数表示. 现在要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量. 定义一朵花A比另一朵花B要美丽,当且仅Sa>=Sb,Ca>=Cb,Ma>=Mb. 显然,两朵花可能有同样的属性.需要统计出评出每个等级的花的数量. Input 第一行为N,K (1 <= N <= 100,000, 1 <= K <= 200,000 ), 分别表示花的数量和最大属性…
CDQ分治2 CDQ套CDQ:四维偏序问题 题目来源:COGS 2479 偏序 #define LEFT 0 #define RIGHT 1 struct Node{int a,b,c,d,bg;}; Node q[_],tmp1[_],tmp2[_]; int aa,bb,cc,dd,n; long long Ans; void cdq2(RG int L,RG int R){ if(L == R)return; RG int mid = (L+R)>>1; cdq2(L,mid); cdq…
简介 CDQ分治是分治的一种, 可以看做归并排序的扩展, 利用离线将一些 \(O(n)\) 的暴力优化到 \(O(log n)\). 它可以用来顶替一些高级(log)数据结构等. 一般地, CDQ分治分为三部分: 递归左右区间 统计左区间对右区间的贡献 合并整个区间 或者: 递归左右区间 分别合并左, 右区间 统计左区间对右区间的贡献 这两种方法一般来说是等价的. 详见代码. 代码 利用cdq分治求三维偏序. #include<cstdio> #include<iostream>…
P3157 [CQOI2011]动态逆序对 题目描述 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序对数. 输入格式 输入第一行包含两个整数n和m,即初始元素的个数和删除的元素个数.以下n行每行包含一个1到n之间的正整数,即初始排列.以下m行每行一个正整数,依次为每次删除的元素. 输出格式 输出包含m行,依次为删除每个元素之前,逆序对的个数. 输入输出样例 输入…
CDQ分治 1.三维偏序问题:三维偏序(陌上花开) #include<bits/stdc++.h> #define RG register #define IL inline #define _ 200005 using namespace std; IL int gi(){ RG int data = 0 , m = 1; RG char ch = 0; while(ch != '-' && (ch<'0'||ch>'9'))ch = getchar(); if(…
前言 \(CDQ\)分治是一个神奇的算法. 它有着广泛的用途,甚至在某些题目中还能取代\(KD-Tree\).树套树等恶心的数据结构成为正解,而且常数还小得多. 不过它也有一定的缺点,如必须离线操作,遇到强制在线的题目还是老老实实打树套树吧... ... 核心思想 \(CDQ\)分治的核心思想真的是非常简单,也就是分与治二字(其实所有分治算法都是这样). 分: 与常见的二分一样,将\([l,r]\)区间内的问题分成两个区间\([l,mid]\)和\([mid+1,r]\)解决. 治: \(CDQ…
题目: Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当且仅当Sa>=Sb,Ca>=Cb,Ma>=Mb.显然,两朵花可能有同样的属性.需要统计出评出每个等级的花的数量. Input 第一行为N,K (1 <= N <= 100,000, 1 <= K <= 200,000 ), 分别表示花的数量和最大属性值. 以下…
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…
题目链接:[http://acm.split.hdu.edu.cn/showproblem.php?pid=5517] 题意:定义multi_set A<a , d>,B<c , d , e>,C<x , y , z>,给出 A , B ,定义 C = A * B = ={⟨a,c,d⟩∣⟨a,b⟩∈A, ⟨c,d,e⟩∈B and b=e} .求出C之后,求C中一个元素t[i]<a , b , c>是否存在一个元素tmp<x , y , z>使…
点此看题面 大致题意: 给你一个从\(1\)到\(n\)的排列,问你每次删去一个元素后剩余的逆序对个数. 关于\(80\)分的树套树 为了练树套树,我找到了这道题目. 但悲剧的是,我的 线段树套\(Treap\) 被卡了!只得了\(80\)分. 其实这个做法思路还是比较简单的,若要删除第\(p_x\)个位置上的元素\(x\),少掉的逆序对个数应为 \([1,p_x-1]\)区间内还未被删掉的元素中小于\(x\)的元素个数 加上 \([p_x+1,n]\)区间内还未被删掉的元素中大于\(x\)的元…
题意: n个电台,每个电台有三个属性xi, ri, fi.分别代表电台的坐标,电台的播报范围,以及播报的频率. 对于一对电台i, j,若min(ri, rj) >= |xi - xj|,那么他们彼此可达. 对于一对电台i, j,他们彼此可达,且当i < j, 若|fi - fj| <= k, 则这一对为关系为bad. 现在给出n个电台的信息,以及k的大小,问bad对的数目. 不存在不同的电台占据同一个位置的数据. 1 <= n <= 1e5, 0 <= k <=…