传送门

给定一个有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)$

$\quad Merge_Sort\ at\ b$ 每个元素标记属于$[l,mid]\or\ [mid+1,r]$

$\quad CDQ2(l,r)$

$CDQ2(l,r)$要做的就是按时间序维护一个二维点集$(c,d)$ 加点与询问一个范围内点的个数

和普通的三维偏序一样,就是多了一个标记的限制(来自$CDQ$中$a$的限制,必须用标记不能判断$a \le mid$,因为$CDQ2$是要递归下去的,$mid$就变了)

有一个时间序$b$和限制$a$,然后$c$归并排序,$d$树状数组维护

完成啦!

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
const int N=5e4+;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int n;
struct Operation{
int a,b,c,d;
bool flag;
}a[N],t1[N],t2[N];
int c[N];
inline int lowbit(int x){return x&-x;}
inline void add(int p,int v){for(;p<=n;p+=lowbit(p)) c[p]+=v;}
inline int sum(int p){
int re=;
for(;p;p-=lowbit(p)) re+=c[p];
return re;
}
int ans;
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;
Operation *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;
Operation *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);
n=read();
for(int i=;i<=n;i++) a[i].b=read();
for(int i=;i<=n;i++) a[i].c=read();
for(int i=;i<=n;i++) a[i].d=read(),a[i].a=i;
CDQ(,n);
printf("%d",ans);
}

COGS 2479. [HZOI 2016]偏序 [CDQ分治套CDQ分治 四维偏序]的更多相关文章

  1. COGS 2479. [HZOI 2016] 偏序 (CDQ套CDQ)

    传送门 解题思路 四维偏序问题,模仿三维偏序,第一维排序,第二维CDQ,最后剩下二元组,发现没办法处理,就继续嵌套CDQ分治.首先把二元组的左右两边分别打上不同的标记,因为统计答案时只统计左边对右边的 ...

  2. COGS 2416.[HZOI 2016]公路修建 & COGS 2419.[HZOI 2016]公路修建2 题解

    大意: [HZOI 2016]公路修建 给定一个有n个点和m-1组边的无向连通图,其中每组边都包含一条一级边和一条二级边(连接的顶点相同),同一组边中的一级边权值一定大于等于二级边,另外给出一个数k( ...

  3. cogs——2478. [HZOI 2016]简单的最近公共祖先

    2478. [HZOI 2016]简单的最近公共祖先 ★☆   输入文件:easy_LCA.in   输出文件:easy_LCA.out   简单对比时间限制:2 s   内存限制:128 MB [题 ...

  4. COGS 2199. [HZOI 2016] 活动投票

    2199. [HZOI 2016] 活动投票 ★★   输入文件:hztp.in   输出文件:hztp.out   简单对比时间限制:0.5 s   内存限制:2 MB [题目描述] 衡中活动很多, ...

  5. COGS 2485. [HZOI 2016]从零开始的序列

    2485. [HZOI 2016]从零开始的序列 ★★   输入文件:sky_seq.in   输出文件:sky_seq.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] ...

  6. COGS 2334. [HZOI 2016]最小函数值

    时间限制:1 s   内存限制:128 MB [题目描述] 有n个函数,分别为F1,F2,...,Fn.定义Fi(x)=Aix2+Bix+Ci(x∈N∗).给定这些Ai.Bi和Ci,请求出所有函数的所 ...

  7. cogs——2419. [HZOI 2016]公路修建2

    2419. [HZOI 2016]公路修建2 ★☆   输入文件:hzoi_road2.in   输出文件:hzoi_road2.out   简单对比时间限制:1 s   内存限制:128 MB [题 ...

  8. cogs——2416. [HZOI 2016]公路修建

    2416. [HZOI 2016]公路修建 ★☆   输入文件:hzoi_road.in   输出文件:hzoi_road.out   简单对比时间限制:1 s   内存限制:128 MB [题目描述 ...

  9. cogs 2478. [HZOI 2016]简单的最近公共祖先

    2478. [HZOI 2016]简单的最近公共祖先 ★☆   输入文件:easy_LCA.in   输出文件:easy_LCA.out   简单对比时间限制:2 s   内存限制:128 MB [题 ...

随机推荐

  1. c#委托事件入门--第一讲:委托入门

    说起委托,有些刚刚入门c#的人感觉很高大上,没有接触过,但是其实很多人都用过Lambda表达式,实际上Lambda表达式就是一个委托. 关于委托入门有个大神写的很详细:张子阳的博客  C#中的委托和事 ...

  2. oracle存储过程的创建和使用

    创建存储过程: 格式:create or replace procedure procedure_name(参数 参数类型) Is/as 变量1 变量1的类型: begin ----------业务逻 ...

  3. HTTP协议----->连接管理

    1.  TCP连接 1.1  TCP为HTTP提供了一条可靠的比特传输管道. TCP(Transmission Control Protocol)----传输控制协议,是主机对主机层的传输控制协议,提 ...

  4. Spark算子--flatMapValues

    转载请标明出处http://www.cnblogs.com/haozhengfei/p/e7a46cecc65720997392516d553d9891.html flatMapValues--Tra ...

  5. php通过ini_set调用output_compression压缩网页

    网页压缩是一种网页优化技术,可以让网页体积缩小后再传输到客户端,从而减少数据传送量,提高速度.这种技术现在使用已经相当普遍,绝大多数网页都使用了这种技术. 网页压缩可以在服务器或空间里通过参数设置启用 ...

  6. 【编程技巧】alert vs Ext.Msg.alert

    alert会阻塞程序的运行. Ext.Msg.alert是异步的,它的调用并不会停止浏览器中代码的执行.

  7. MyEclipse或Eclipse导出JavaDoc中文乱码问题解决

  8. JVM内存划分简介

    参考:深入理解JAVA虚拟机(第二版)

  9. Linux - 在Ubuntu下永久修改主机名

    查看主机名 root@jiqing:~# hostname jiqing 1.临时生效 root@jiqing:~# hostname jq root@jiqing:~# hostname jq 重新 ...

  10. 【处理多服务器日志合并处理问题】多服务器的日志合并统计——apache日志的cronolog轮循

    转发:http://www.chedong.com/tech/rotate_merge_log.html   内容摘要:你完全不必耐心地看完下面的所有内容,因为结论无非以下2点:1 用 cronolo ...