[COGS2580]偏序 II

题目大意:

\(n(n\le50000)\)个五元组,求五维偏序。

思路:

CDQ分治套CDQ分治套CDQ分治套树状数组。

时间复杂度\(\mathcal O(n\log^4 n)\)。

源代码:

#include<cstdio>
#include<cctype>
#include<algorithm>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
typedef long long int64;
const int N=50001;
int n;
int64 ans;
struct Node {
int a,b,c,d,t1,t2;
};
Node a[N];
inline bool cmp1(const Node &p1,const Node &p2) {
return p1.a<p2.a;
}
inline bool cmp2(const Node &p1,const Node &p2) {
return p1.b<p2.b;
}
inline bool cmp3(const Node &p1,const Node &p2) {
return p1.c<p2.c;
}
class FenwickTree {
private:
int val[N];
int lowbit(const int &x) const {
return x&-x;
}
public:
void modify(int p,const int &x) {
for(;p<=n;p+=lowbit(p)) val[p]+=x;
}
int query(int p) const {
int ret=0;
for(;p;p-=lowbit(p)) ret+=val[p];
return ret;
}
};
FenwickTree t;
void cdq3(const int &b,const int &e) {
if(b==e) return;
const int mid=(b+e)>>1;
cdq3(b,mid);
cdq3(mid+1,e);
int p=b,q=mid+1;
for(;q<=e;q++) {
if(a[q].t1==1||a[q].t2==1) continue;
for(;p<=mid&&a[p].c<a[q].c;p++) {
if(a[p].t1==1&&a[p].t2==1) {
t.modify(a[p].d,1);
}
}
ans+=t.query(a[q].d);
}
while(--p>=b) {
if(a[p].t1==1&&a[p].t2==1) {
t.modify(a[p].d,-1);
}
}
std::inplace_merge(&a[b],&a[mid]+1,&a[e]+1,cmp3);
}
void cdq2(const int &b,const int &e) {
if(b==e) return;
const int mid=(b+e)>>1;
cdq2(b,mid);
cdq2(mid+1,e);
for(register int i=b;i<=mid;i++) a[i].t2=1;
for(register int i=mid+1;i<=e;i++) a[i].t2=2;
std::inplace_merge(&a[b],&a[mid]+1,&a[e]+1,cmp2);
cdq3(b,e);
std::sort(&a[b],&a[e]+1,cmp2);
}
void cdq1(const int &b,const int &e) {
if(b==e) return;
const int mid=(b+e)>>1;
cdq1(b,mid);
cdq1(mid+1,e);
for(register int i=b;i<=mid;i++) a[i].t1=1;
for(register int i=mid+1;i<=e;i++) a[i].t1=2;
std::inplace_merge(&a[b],&a[mid]+1,&a[e]+1,cmp1);
cdq2(b,e);
std::sort(&a[b],&a[e]+1,cmp1);
}
int main() {
freopen("partial_order_two.in","r",stdin);
freopen("partial_order_two.out","w",stdout);
n=getint();
for(register int i=1;i<=n;i++) a[i].a=getint();
for(register int i=1;i<=n;i++) a[i].b=getint();
for(register int i=1;i<=n;i++) a[i].c=getint();
for(register int i=1;i<=n;i++) a[i].d=getint();
cdq1(1,n);
printf("%lld\n",ans);
return 0;
}

[COGS2580]偏序 II的更多相关文章

  1. [HZOI2016]偏序&[HZOI2015]偏序II K维偏序问题

    description Cogs: [HZOI2016]偏序 [HZOI2015]偏序 II data range \[ n\le 5\times 10^4\] solution 嵌套\(CDQ\)的 ...

  2. COGS 2580. [HZOI 2015]偏序 II

    COGS 2580. [HZOI 2015]偏序 II 题目传送门 题目大意:给n个元素,每个元素有具有4个属性a,b,c,d,求i<j并且ai<aj,bi<bj,ci<cj, ...

  3. 【CJOJ2375】 【HZOI 2015】偏序 II(cdq分治,树状数组)

    传送门 CJOJ Solution 具体实现参考上一篇Blog(四维偏序) 代码实现1(cdq+cdq+cdq+BIT) /* mail: mleautomaton@foxmail.com autho ...

  4. 几道很Interesting的偏序问题

    若干道偏序问题(STL,分块) 找了4道题目 BZOJ陌上花开(权限题,提供洛谷链接) Cogs2479偏序 Cogs2580偏序II Cogs2639偏序++ 作为一个正常人,肯定先看三维偏序 做法 ...

  5. CDQ分治嵌套模板:多维偏序问题

    CDQ分治2 CDQ套CDQ:四维偏序问题 题目来源:COGS 2479 偏序 #define LEFT 0 #define RIGHT 1 struct Node{int a,b,c,d,bg;}; ...

  6. $CDQ$分治总结

    A.\(CDQ\) 分治 特别基础的教程略. \(CDQ\)分治的优缺点: ( 1 )优点:代码量少,常数极小,可以降低处理维数. ( 2 )缺点:必须离线处理. \(CDQ\)分治与其他分治最本质的 ...

  7. poj2352树状数组解决偏序问题

    树状数组解决这种偏序问题是很厉害的! /* 输入按照y递增,对于第i颗星星,它的level就是之前出现过的星星中,横坐标小于i的总数 */ #include<iostream> #incl ...

  8. bzoj3262: 陌上花开 三维偏序cdq分治

    三维偏序裸题,cdq分治时,左侧的x一定比右侧x小,然后分别按y排序,对于左侧元素按y大小把z依次插入到树状数组里,其中维护每个左侧元素对右侧元素的贡献,在bit查询即可 /************* ...

  9. 【算法学习】【洛谷】cdq分治 & P3810 三维偏序

    cdq是何许人也?请参看这篇:https://wenku.baidu.com/view/3b913556fd0a79563d1e7245.html. 在这篇论文中,cdq提出了对修改/询问型问题(Mo ...

随机推荐

  1. imperva 获取gti文档

    SSH到设备(MX或GW) 以root用户身份登录MX和GW 运行“impctl support get-tech-info --last-server-archives=5 --caes-numbe ...

  2. Linux USB驱动学习总结(三)---- USB鼠标的加载、初始化和通信过程

    1.usbmouse的定义:usb鼠标既包含usb设备(usb_device)的属性也包含input输入设备(input_dev)的属性 struct usb_mouse { ];///USB鼠标设备 ...

  3. video标签、audio标签

    1.video标签 <video src="nans.mp4" controls="controls"  autoplay="autoplay& ...

  4. K/V式枚举

    public enum OType { LOGIN { public String getDesc() { return "登录"; } }, ADD { public Strin ...

  5. 微软Holographic将更名为Windows Mixed Reality

    微软Holographic将更名为Windows Mixed Reality ----世界变化好快.  还没来得及细细品味,它就已经更名了. 程序员的焦虑,处在一个信息大爆炸的年代,大数据,云计算,机 ...

  6. 08 Packages 包

    Packages   Standard library Other packages Sub-repositories Community Standard library Name Synopsis ...

  7. ansible的几点记录

    user模块的password加密 ansible中user模块的password需要传入加密数据,可以通过这种方式快速加密: To get a sha512 password hash (rando ...

  8. Python 常用的内建函数

    内建函数 ​ Build-in Function,启动python解释器,输入dir(__builtins__), 可以看到很多python解释器启动后默认加载的属性和函数,这些函数称之为内建函数, ...

  9. 字体格式类型(.eot/.otf/.woff/.svg)

    @font-face语句是css中的一个功能模块,用于实现网页字体多样性的模块(设计者可随意指定字体,不需要考虑浏览者电脑上是否安装). @font-face文件 而由于网页中使用的字体类型,也是各浏 ...

  10. git —— 异常1,index.lock

    git提交过程中出现的问题 解决方法:找到 index.lock文件将其删除 一般 index.lock 在.git下面, 有时 .git 是隐藏的,但是无论怎样, 可以通过 everything 找 ...