四维偏序 CDQ套CDQ
对CDQ深一步的理解
昨天做了一道CDQ,看了一堆CDQ可做的题,今天又做了一道四维偏序
感觉对CDQ的理解又深了一点,故来写一写现在自己对于CDQ的理解
CDQ其实就是实现了这样的一个问题的转化:
\(a_{l} < a_{l+1} < ... < a_r => (a_l,a_{l+1},...,a_{mid}) \text{都小于} (a_{mid+1},a{mid+2},...,a_r)\)
然后我们就知道这时候左边所有的点都一定小于右边的点
在四维偏序的算法中,那就是左边的点可以对右边的点做出贡献(仅在当前维度下)
这样就强行消除了一个维度的限制.
四维偏序
COGS 2479
题目大意
给定一个有\(n\)个元素的序列,元素编号为\(1~n\),每个元素有三个属性\(a,b,c\),求序列中满足\(i<j\)且\(a_i<a_j\)且\(b_i<b_j\)且\(c_i<c_j\)的数对\((i,j)\)的个数。
题解
我们把下标也看作一个维度,那么这就是个四维偏序
我们在下标的维度上CDQ
然后记录每个元素在第一次CDQ中是较小的还是较大的.
因为只有较小的元素才能对较大的元素做出贡献
只有较大的元素才能接受较小的元素的影响.
所以我们处理出来后这就变成了一个三维偏序
所以我们在对这个序列(CDQ+扫描线+树状数组)求三维偏序即可
Code
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(int &x){x=0;char ch;bool flag = false;while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
const int maxn = 50010;
struct Node{int a,b,c;bool is_sm;Node(){a=b=c=is_sm = 0;}
}a[maxn],tmp1[maxn],tmp2[maxn];
int c[maxn],n,init_tmp[maxn],ans=0;
#define lowbit(x) (x&-x)
inline void modify(int x,int y){for(;x<=n;x+=lowbit(x)) c[x] += y;
}
inline int query(int x){int ret = 0;for(;x;x-=lowbit(x)) ret += c[x];return ret;
}
void solve2(int l,int r){if(l == r) return ;int mid = l+r >> 1;solve2(l,mid);solve2(mid+1,r);int i = l,j = mid+1,k = l;Node *a = tmp1,*tmp = tmp2;init_tmp[0] = 0;while(i <= mid || j <= r){if((j > r) || (i <= mid && a[i].b < a[j].b)){if( a[i].is_sm){modify(a[i].c,1);init_tmp[++init_tmp[0]] = i;}tmp[k++] = a[i++];}else{if(!a[j].is_sm){ans += query(a[j].c);}tmp[k++] = a[j++];}}for(int i = 1;i<=init_tmp[0];++i) modify(a[init_tmp[i]].c,-1);copy(tmp+l,tmp+r+1,a+l);
}
void solve1(int l,int r){if(l == r) return ;int mid = l+r >> 1;solve1(l,mid);solve1(mid+1,r);int i = l,j = mid+1,k = l;Node *tmp = tmp1;while(i <= mid || j <= r){if((j > r) || (i <= mid && a[i].a < a[j].a)){(tmp[k++] = a[i++]).is_sm = true;}else (tmp[k++] = a[j++]).is_sm = false;}copy(tmp+l,tmp+r+1,a+l);solve2(l,r);
}
int main(){
// freopen("partial_order.in","r",stdin);
// freopen("partial_order.out","w",stdout);read(n);for(int i=1;i<=n;++i) read(a[i].a);for(int i=1;i<=n;++i) read(a[i].b);for(int i=1;i<=n;++i) read(a[i].c);solve1(1,n);printf("%d\n",ans);getchar();getchar();return 0;
}
转载于:https://www.cnblogs.com/Skyminer/p/6405323.html
四维偏序 CDQ套CDQ相关推荐
- HDU5126 stars(4维偏序->cdq套cdq+树状数组)
stars 题目大意: 在一个三维空间当中,每次进行一个操作,添加一个点或者统计空间中的某一个长方体范围内的所有点 三维空间中我们用两个点即可确定一个长方体. 首先效仿平面二维数点的方法,根据容斥原理 ...
- 【CJOJ2616】 【HZOI 2016】偏序 I(cdq分治,树状数组)
传送门 CJOJ Solution 考虑这是一个四维偏序对吧. 直接cdq套在一起,然后这题有两种实现方法(树状数组的更快!) 代码实现1(cdq+cdq+cdq) /*mail: mleautoma ...
- 多维偏序总结(CDQ)
对于一维偏序, 大概就是直接排序, 一般sort()直接解决; 对于二维偏序,(比如有求逆序对)此时就需要用sort()+暴力降维的方法.或者是sort() + 树状数组来解决: 而对于三维偏序, 就 ...
- P4849 寻找宝藏(模板:四维偏序)
stable_sort 保平安. 解析 dp方程显而易见,关键就是如何进行这个四维偏序的转移. 考虑三维偏序(比如拦截导弹)我们是如何做的? 先按照第一维排序,然后分治解决前一半,接下来把前一半的第一 ...
- P3810-[模板]三维偏序(陌上花开)【CDQ分治,树状数组】
正题 题目链接:https://www.luogu.com.cn/problem/P3810 题目大意 nnn个三元组(a,b,c)(a,b,c)(a,b,c),f(i)=∑i=1n,j≠i[aj≤a ...
- bzoj2683:简单题(树状数组套CDQ分分治)
CDQ(陈丹琦)分治 CDQ显然是一个人的名字(2008NOI金牌选手陈丹琦) 这种离线的分治算法在算法界被称为"CDQ分治". 首先回忆一下归并排序的分治, 它的操作是将数组二 ...
- CDQ分治嵌套模板:多维偏序问题
CDQ分治2 CDQ套CDQ:四维偏序问题 题目来源:COGS 2479 偏序 #define LEFT 0 #define RIGHT 1struct Node{int a,b,c,d,bg;}; ...
- 浅谈CDQ分治与偏序问题
初识CDQ分治 CDQ分治是一个好东西,一直听着dalao们说所以就去学了下. CDQ分治是我们处理各类问题的重要武器.它的优势在于可以顶替复杂的高级数据结构,而且常数比较小:缺点在于必须离线操作. ...
- CDQ分治学习及例题总结
文章目录 1.**使用cdq分治的条件:** 2.**cdq分治的性质:** 3. **cdq使用步骤:** 4.**自己对cdq分治学习的一些感悟:** 5. cdq分治的详细讲解(转自[stdca ...
最新文章
- android 中文 API (41) —— RatingBar.OnRatingBarChangeListener
- bzoj2067: [Poi2004]SZN
- [爬虫+数据分析] 分析北京Python开发的现状
- 一个女程序员的第七年工作总结
- 乘法运算-快速傅里叶变换
- eclipse光标变成黑块变粗解决办法
- python里面的tuple与list对比
- htc816t Android go,HTC D816t(Desire D816t 移动4G)一键刷机图文教程详解
- java对csv格式的读写操作
- MODULE_DEVICE_TABLE【转】
- puml绘制思维导图_免费在线思维导图神器 简单又漂亮 比Wodrd好用很多
- php查netstat,Netstat命令详解
- 工资管理系统数据库设计
- npm ERR! code ETIMEDOUTnpm ERR! syscall connectnpm ERR! errno ETIMEDOUTnpm ERR! network request t
- AI明星上市受阻,是继续融资还是割肉?
- Vue-Router给当前url添加参数时报错 Navigation Duplicated Avoided redundant navigation to current location
- 数据结构,关于链表的问题,为何直接free()不会造成断链。引用的好处
- 炸了!3年图片都没了!
- 高通新款高端芯片抢闸发布,小米将首发,趁机从华为手里抢夺市场
- 炸金花游戏(1)--炸金花游戏的模型设计和牌力评估