[COGS2479 && COGS2639]高维偏序(CDQ分治,bitset)
COGS2479:四维偏序。
CDQ套CDQ
CDQ:对a分治,对b排序,再对a打标记,然后执行CDQ2
CDQ2:对b分治,对c归并排序,对d树状数组。
#include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=l; i<=r; i++)
using namespace std;
typedef long long ll; const int N=;
int n,ans,c[N];
struct P{ int a,b,c,d; bool flag; }a[N],t1[N],t2[N]; void add(int p,int v){ for(;p<=n;p+=p&-p) c[p]+=v;}
int sum(int p){ int re=; for(;p;p-=p&-p) re+=c[p]; return re; } void CDQ2(int l,int r){
if(l==r) return;
int mid=(l+r)>>;
CDQ2(l,mid); CDQ2(mid+,r);
int i=l,j=mid+,p=l;
P *a=t1,*t=t2;
while(i<=mid||j<=r){
if(j>r||(i<=mid&&a[i].c<a[j].c)){
if(a[i].flag) add(a[i].d,);
t[p++]=a[i++];
}else{
if(!a[j].flag) ans+=sum(a[j].d);
t[p++]=a[j++];
}
}
for(int i=l;i<=mid;i++) if(a[i].flag) add(a[i].d,-);
for(int i=l;i<=r;i++) a[i]=t[i];
} void CDQ(int l,int r){
if(l==r) return;
int mid=(l+r)>>;
CDQ(l,mid);CDQ(mid+,r);
int i=l,j=mid+,p=l;
P *t=t1;
while(i<=mid||j<=r){
if(j>r||(i<=mid&&a[i].b<a[j].b)) (t[p++]=a[i++]).flag=;
else (t[p++]=a[j++]).flag=;
}
for(int i=l;i<=r;i++) a[i]=t[i];
CDQ2(l,r);
} int main(){
freopen("partial_order.in","r",stdin);
freopen("partial_order.out","w",stdout);
scanf("%d",&n);
rep(i,,n) scanf("%d",&a[i].b);
rep(i,,n) scanf("%d",&a[i].c);
rep(i,,n) scanf("%d",&a[i].d),a[i].a=i;
CDQ(,n); printf("%d",ans);
return ;
}
COGS2639 7维偏序。
每一维记录前面的比当前这一维小的数个数,最后bitset取&就好了。
分块降低时空复杂度,均为$O(kn\sqrt{n})$。
#include <cstdio>
#include <cmath>
#include <bitset>
#include <algorithm>
#define rep(i,l,r) for (int i=l; i<=r; i++)
using namespace std;
typedef long long ll;
typedef bitset<>bit; const int N=;
int n,k,size,block[N]; struct Bitset{
int a[N],lis[N];
bit B[];
bit get(int p){
p=a[p]; int bp=block[p]; bit ans=B[bp-];
for(int i=(bp-)*size+;i<p;i++) ans.set(lis[i]);
return ans;
}
}d[]; void build(int op){
rep(i,,n) d[op].lis[d[op].a[i]]=i;
bit t; t.reset();
rep(i,,n){
t.set(d[op].lis[i]);
if(i%size==) d[op].B[i/size]=t;
}
} int main(){
freopen("partial_order_plus.in","r",stdin);
freopen("partial_order_plus.out","w",stdout);
scanf("%d%d",&n,&k); size=sqrt(n);
rep(i,,n) block[i]=(i-)/size+;
rep(i,,n) d[].a[i]=i;
rep(i,,k) rep(j,,n) scanf("%d",&d[i].a[j]);
rep(i,,k) build(i);
int ans=;
rep(i,,n){
bit t=d[].get(i);
rep(j,,k) t&=d[j].get(i);
ans+=t.count();
}
printf("%d\n",ans);
return ;
}
更高维的偏序呢?$O(n^2)$暴力吧。
[COGS2479 && COGS2639]高维偏序(CDQ分治,bitset)的更多相关文章
- Luogu 3810 & BZOJ 3262 陌上花开/三维偏序 | CDQ分治
Luogu 3810 & BZOJ 3263 陌上花开/三维偏序 | CDQ分治 题面 \(n\)个元素,每个元素有三个值:\(a_i\), \(b_i\) 和 \(c_i\).定义一个元素的 ...
- COGS 2479. [HZOI 2016]偏序 [CDQ分治套CDQ分治 四维偏序]
传送门 给定一个有n个元素的序列,元素编号为1~n,每个元素有三个属性a,b,c,求序列中满足i<j且ai<aj且bi<bj且ci<cj的数对(i,j)的个数. 对于100%的 ...
- bzoj3262: 陌上花开 三维偏序cdq分治
三维偏序裸题,cdq分治时,左侧的x一定比右侧x小,然后分别按y排序,对于左侧元素按y大小把z依次插入到树状数组里,其中维护每个左侧元素对右侧元素的贡献,在bit查询即可 /************* ...
- [bzoj] 3263 陌上花开 洛谷 P3810 三维偏序|| CDQ分治 && CDQ分治讲解
原题 定义一个点比另一个点大为当且仅当这个点的三个值分别大于等于另一个点的三个值.每比一个点大就为加一等级,求每个等级的点的数量. 显然的三维偏序问题,CDQ的板子题. CDQ分治: CDQ分治是一种 ...
- BZOJ3262 陌上花开 —— 三维偏序 CDQ分治
题目链接:https://vjudge.net/problem/HYSBZ-3262 3262: 陌上花开 Time Limit: 20 Sec Memory Limit: 256 MBSubmit ...
- BZOJ 3295:[Cqoi2011]动态逆序对(三维偏序 CDQ分治+树状数组)
http://www.lydsy.com/JudgeOnline/problem.php?id=3295 题意:简单明了. 思路:终于好像有点明白CDQ分治处理三维偏序了.把删除操作看作是插入操作,那 ...
- 三维偏序[cdq分治学习笔记]
三维偏序 就是让第一维有序 然后归并+树状数组求两维 cdq+cdq不会 告辞 #include <bits/stdc++.h> // #define int long long #def ...
- [偏序关系与CDQ分治]【学习笔记】
组合数学真是太棒了 $CDQ$真是太棒了(雾 参考资料: 1.<组合数学> 2.论文 课件 很容易查到 3.sro __stdcall 偏序关系 关系: 集合$X$上的关系是$X$与$X$ ...
- 洛谷P3810-陌上开花(三维偏序, CDQ, 树状数组)
链接: https://www.luogu.org/problem/P3810#submit 题意: 一个元素三个属性, x, y, z, 给定求f(b) = {ax <= bx, ay < ...
随机推荐
- C++——派生类中的访问——可见性问题
C++中派生类对基类成员的访问形式主要有以下两种: 1.内部访问:由派生类中新增成员对基类继承来的成员的访问. 2.对象访问:在派生类外部,通过派生类的对象对从基类继承来的成员的访问.今天给大家介绍在 ...
- C++——拷贝构造函数说明
一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: [c-sharp] view plaincopy 1 int a = 100; 2 int b = a; 而类对 ...
- 手把手教你通过Eclipse工程配置调用JNI完全攻略
本文地址:http://www.cnblogs.com/wavky/p/JNI.html 当你找到并鬼使神差地打开这个博文的时候,我敢肯定你已经知道什么是JNI,基本概念就不粘贴了. 百度出来的JNI ...
- Hadoop 学习之MapReduce
MapReduce充分利用了分而治之,主要就是将一个数据量比较大的作业拆分为多个小作业的框架,而用户需要做的就是决定拆成多少份,以及定义作业本身,用户所要做的操作少了又少,真是Very Good! 一 ...
- 使用adobe pdf去除PDF文档中的批量雷同文本
一.问题的提出 MgoSoft tiff to pdf软件没有提供中国地区的非VISA用户的购买渠道,中国通常都是银联标识走天下,卡不是VISA买不了这样的软件, 那么, MgoSoft tiff t ...
- LA2995 Image is everything
蓝书P12 #include <cstdio> #include <cstring> #include <cmath> #include <algorithm ...
- namenode磁盘满引发recover edits文件报错
前段时间公司hadoop集群宕机,发现是namenode磁盘满了, 清理出部分空间后,重启集群时,重启失败. 又发现集群Secondary namenode 服务也恰恰坏掉,导致所有的操作log持续写 ...
- JAVA路线
[转]Java自学之路——by马士兵 作者:马士兵老师 JAVA自学之路 一:学会选择 为了就业,不少同学参加各种各样的培训. 决心做软件的,大多数人选的是java,或是.net,也有一些选择了手机. ...
- 2017年上海金马五校程序设计竞赛:Problem C : Count the Number (模拟)
Description Given n numbers, your task is to insert '+' or '-' in front of each number to construct ...
- [bzoj1568][JSOI2008]Blue Mary开公司——李超线段树
题目大意 题解 这道题需要用到一种叫做李超线段树的东西.我对于李超线段树,是这样理解的: 给节点打下的标记不进行下传,而是仅仅在需要的时候进行下传,这就是所谓永久化标记. 对于这道题,借用一张图, 这 ...