[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 < ...
随机推荐
- Educational Codeforces Round 55 (Rated for Div. 2):C. Multi-Subject Competition
C. Multi-Subject Competition 题目链接:https://codeforces.com/contest/1082/problem/C 题意: 给出n个信息,每个信息包含专业编 ...
- DES 加密解密
[概念] 数据加密算法(Data Encryption Algorithm,DEA)是一种对称加密算法,很可能是使用最广泛的密钥系统,特别是在保护金融数据的安全中,最初开发的DEA是嵌入硬件中的.通常 ...
- barba.js 优化页面跳转用户体验
barba.js 原理就是在a页面中显示b页面的内容,样式为刷新,给用户以页面跳转后无刷新体验,注意样式命名,ab页面引用的样式和js要相同 可以在页面之间创建良好的转换,增强用户的体验. 减少HTT ...
- Windows下安装Mycat
Mycat 首先在安装Mycat之前,需要安装JDK1.7以上,可以在cmd环境下输入 java -version 查看本地安装的java版本 如果未安装或者版本在1.7以下,请重新安装. 安装JDK ...
- 关于border边框重叠颜色设置问题
盒子模型包括:margin border padding content 在标准盒子模型中 conten不包括border和padding 就是他自身内容所包含的区域. 在IE盒子模型中 co ...
- struts2和jstl有关循环的写法
一:前言 其实觉得自己现在就是个码农啊,对于struts2的标签和jstl的标签我一直都是只会用,但是觉得自己老是会混淆这种概念性的问题.所以我自己在代码里面就试着用了几种方式,实现同一种效果,下面就 ...
- HDFS之FileSystem
package cn.hx.test; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.*; impo ...
- linux驱动学习(八) i2c驱动架构(史上最全) davinc dm368 i2c驱动分析【转】
转自:http://blog.csdn.net/ghostyu/article/details/8094049 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 预备知识 lin ...
- Git-cheatsheet
- DRF的限流功能
限流,可以对接口访问的频次进行限制,以减轻服务器压力. 全局配置 在settings.py上添加 REST_FRAMEWORK = { 'DEFAULT_THROTTLE_CLASSES': ( 'r ...