COGS2479(四维偏序)

题意:给定一个有n个元素的序列,元素编号为1~n,每个元素有三个属性a,b,c,求序列中满足i<j且ai<aj且bi<bj且ci<cj的数对(i,j)的个数。

分析:cdq分治套cdq分治

   对于四维偏序,可以先对第一维排序,然后对第一维分治,按照第二维顺序合并

   即cdq(l,r)表示分治第一维,然后把这里面的按照第二维的顺序从小到大排序

   然后问题就变成了三维偏序,再套一个cdq2(l,r)去更新答案

   不过要注意一点很关键的,那就是按照第二维排序后,第一维已经是乱序了

   根据cdq分治的思想,我们可以在cdq(l,r)合并时,对于一个区间的所有位置标记是属于左边还是属于右边,再排序(因为只有左边的点才能更新右边的点)

   那么在cdq2的时候需要再加一个限制条件,那就是更新的时候要判断该点的flag是否为0;累计结果的时候要判断该点的flag是否为1

   时间复杂度O(nlog^3n)

时间: 2024-08-04 02:28:59

COGS2479(四维偏序)的相关文章

论如何优雅的用bitset来求四维偏序

四维偏序.. 就是给你一个四维集合.再给你一些询问,请你求出a[i].x1<=ask.x1&&a[i].x2<=ask.x2&&a[i].x3<=ask.x3&&a[i].x4<=ask.x4的个数.. 集合大小<=30000 询问个数<=30000 然后怎么做呢?? 其实很简单只要排序+cdq+树状数组套平衡树什么的就行了 qnmd老子不会.. 这时! 神器来了! 那就是bitset! 众所周知,bitset能存一堆二进

四维偏序

我是萌萌的传送门 终于(算是)学会CDQ套CDQ了= =看来我对分治的理解还是不太深,要不然怎么会只会用CDQ压掉一维却不会压掉更高维呢-- 题目就是个最简单的四维偏序,为了简化问题把四维都搞成了1~n的排列(废话,出题人可是我自己= =),还把四维LIS换成了四维正序对(该是有多懒--) 四维偏序的话其实压力还是有点大的,首先O(nlog3n)的算法跟暴力差距真的不是特别大,不过经实测除了树套树套树速度和暴力差不多之外剩下的两种做法都是比较快的(经测试n=50000的数据暴力要跑大概6s+,好

HDU 5126(stars)四维偏序,cdq分治

题意:给两种操作,进行5万次.操作一:加入一个三维序偶(a,b,c)到集合S里:第二种操作,给两个三维序偶(a1,b1,c1)和(a2,b2,c2),问当前S里有多少个序偶(a,b,c)满足a1<=a<=a2, b1<=b<=b2, c1<=c<=c2.题目保证了a1<=a2,b1<=b2,c1<=c2.所有数在[1,1e9]内 链接:http://acm.hdu.edu.cn/showproblem.php?pid=5126 解法:将操作编号也加入到

【教程】CDQ套CDQ——四维偏序问题【转载】

转自 前言 上一篇文章已经介绍了简单的CDQ分治,包括经典的二维偏序和三维偏序问题,还有带修改和查询的二维/三维偏序问题.本文讲介绍多重CDQ分治的嵌套,即多维偏序问题. 四维偏序问题       给定N(N<=20000)个有序四元组(a,b,c,d),求对于每一个四元组(a,b,c,d),有多少个四元组(a2,b2,c2,d2)满足a2<a && b2<b && c2<c && d2<d.        不需要太多思考,就能

COGS 2479. [HZOI 2016]偏序 [CDQ分治套CDQ分治 四维偏序]

传送门 给定一个有n个元素的序列,元素编号为1~n,每个元素有三个属性a,b,c,求序列中满足i<j且ai<aj且bi<bj且ci<cj的数对(i,j)的个数. 对于100%的数据,1<=n<=50000,保证所有的ai.bi.ci分别组成三个1~n的排列. $CDQ$分治套$CDQ$分治也不是很难嘛 对于本题,设四维$a,b,c,d$ $Sort\ at\ a$ $CDQ(l,r)$ $\quad CDQ(l,mid)$ $\quad CDQ(mid+1,r)$ $\

四维偏序(K-D-Tree+rebuild)

其实只是放个代码,会K-D-Tree的同学看了就知道怎么rebuild了,其实也是很简单粗暴的-- 单独再发一次吧,感觉把代码跟之前的一起发不知道啥时候就找不到了-- 1 #include<bits/stdc++.h> 2 #define N 50010 3 #define inf 1000000009 4 #define lson (t1[o].l) 5 #define rson (t1[o].r) 6 using namespace std; 7 typedef long long ll;

【COGS2479】 HZOI2016—偏序

http://cogs.pro/cogs/problem/problem.php?pid=2479 (题目链接) 题意 四维偏序. Solution CDQ套CDQ. 细节 第二次分治不能直接按照mid分离两类数了. 代码 // cogs2479 #include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include&

COGS 2479 偏序 题解

[题意] 给定一个有n个元素的序列,元素编号为1~n,每个元素有三个属性a,b,c,求序列中满足i<j且ai<aj且bi<bj且ci<cj的数对(i,j)的个数. 对于30%的数据,n<=5000. 对于100%的数据,1<=n<=50000(原题写错了哈哈),保证所有的ai.bi.ci分别组成三个1~n的排列. [解法] 标题已经说了这是偏序,读完题,这就是个四维偏序模板题(位置一维,a,b,c剩下三维). 解法多多,我用的是CDQ树套树(树套树写的树状数组套替

【JZOJ4419】【GDOI2016模拟4.2】hole(四~三维偏序问题)

Problem 给出n次事件,每次事件给出三个非负整数x,y,d.d=0表示在点(x,y)打了一个洞:否则表示询问由(x,y),(x+d,y),(x,y+d)三点围成的三角形中洞的个数. Hint 30%的数据n<=3333 . 另30% 的数据 GFS只会在DSJ打完洞后才开始询问,xi,yi<=333333 . 100%的数据 1<=n<=88888,xi,yi<=3333333 . Solution 算法I:暴力 考虑对于询问(i,j,d),若点(x,y)在该询问的三角