题目链接

思路

四维偏序

\(CDQ\)套\(CDQ\),第一维默认有序。第二维用第一个\(CDQ\)变成有序的。并且对每个点标记上第一维属于左边还是右边。第二个\(CDQ\)处理第三维,注意两个\(CDQ\)不能用同一个数组,否则第二维就变成无序的了。最后一维用个树状数组统计答案。

代码

/*
* @Author: wxyww
* @Date: 2019-02-16 16:39:12
* @Last Modified time: 2019-02-17 08:18:59
*/
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<ctime>
using namespace std;
typedef long long ll;
const int N = 50010;
ll read() {
ll x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
int n;
struct node {
int a,b,c,d,opt;
}a[N],tmp[N],tt[N];
bool cmp(const node &x,const node &y) {
return x.a <= y.a;
}
int tree[N];
int mx;
void update(int pos,int c) {
while(pos <= mx) {
tree[pos] += c;
pos += pos & -pos;
}
}
int query(int pos) {
int ret = 0;
while(pos) {
ret += tree[pos];
pos -= pos & -pos;
}
return ret;
}
vector<int>v;
int ans;
void cdq2(int l,int r) {
if(r <= l) return;
int mid = (l + r) >> 1;
cdq2(l,mid);
cdq2(mid + 1,r);
int L = l,R = mid + 1,now = l;
while(L <= mid && R <= r) {
if(tmp[L].c < tmp[R].c) {
if(tmp[L].opt == 1) update(tmp[L].d,1),v.push_back(tmp[L].d);
tt[now++] = tmp[L++];
}
else {
if(tmp[R].opt == 2) ans += query(tmp[R].d - 1);
tt[now++] = tmp[R++];
}
}
while(L <= mid) tt[now++] = tmp[L++];
while(R <= r) {
if(tmp[R].opt == 2) ans += query(tmp[R].d - 1);
tt[now++] = tmp[R++];
}
for(int i = l;i <= r;++i) tmp[i] = tt[i];
int k = v.size();
for(int i = 0;i < k;++i) update(v[i],-1);
v.clear();
}
void cdq(int l,int r) {
if(r <= l) return;
int mid = (l + r) >> 1;
cdq(l,mid);
cdq(mid + 1,r);
int L = l,R = mid + 1,now = l;
while(L <= mid && R <= r) {
if(a[L].b < a[R].b) tmp[now] = a[L++],tmp[now++].opt = 1;
else tmp[now] = a[R++],tmp[now++].opt = 2;
}
while(L <= mid) tmp[now] = a[L++],tmp[now++].opt = 1;
while(R <= r) tmp[now] = a[R++],tmp[now++].opt = 2;
for(int i = l;i <= r;++i) a[i] = tmp[i];
cdq2(l,r);
}
int main() {
n = read();
for(int i = 1;i <= n;++i) mx = max(mx,(a[i].a = i));
for(int i = 1;i <= n;++i) mx = max(mx,(a[i].b = read()));
for(int i = 1;i <= n;++i) mx = max(mx,(a[i].c = read()));
for(int i = 1;i <= n;++i) mx = max(mx,(a[i].d = read()));
cdq(1,n);
cout<<ans;
return 0;
}

cogs2479 偏序(CDQ套CDQ)的更多相关文章

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

    传送门 思路: 就是cdq套cdq的模板题 #include <bits/stdc++.h> using namespace std; typedef long long ll; cons ...

  2. HDU - 5126: stars (求立方体内点数 CDQ套CDQ)

    题意:现在给定空空的三维平面,有加点操作和询问立方体点数. 思路:考虑CDQ套CDQ.复杂度是O(NlogN*logN*logN),可以过此题. 具体的,这是一个四维偏序问题,4维分别是(times, ...

  3. HDU5126---stars (CDQ套CDQ套 树状数组)

    题意:Q次操作,三维空间内 每个星星对应一个坐标,查询以(x1,y1,z1) (x2,y2,z2)为左下顶点 .右上顶点的立方体内的星星的个数. 注意Q的范围为50000,显然离散化之后用三维BIT会 ...

  4. 四维偏序 CDQ套CDQ

    对CDQ深一步的理解 昨天做了一道CDQ,看了一堆CDQ可做的题,今天又做了一道四维偏序 感觉对CDQ的理解又深了一点,故来写一写现在自己对于CDQ的理解 CDQ其实就是实现了这样的一个问题的转化: ...

  5. 【教程】CDQ套CDQ——四维偏序问题

    前言 上一篇文章已经介绍了简单的CDQ分治,包括经典的二维偏序和三维偏序问题,还有带修改和查询的二维/三维偏序问题.本文讲介绍多重CDQ分治的嵌套,即多维偏序问题. 四维偏序问题       给定N( ...

  6. HDU 5126 stars 4维偏序, CDQ套CDQ

    题目传送门 题意:在一个星空中,按着时间会出现一些点,现在john想知道,在某个时间内有多少个星星是的坐标是满足条件的.(x1<=x<=x2, y1 <= y <= y2, z ...

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

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

  8. hdu 5126 stars (四维偏序,离线,CDQ套CDQ套树状数组)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5126 思路:支持离线,那么我们可以用两次CDQ分治使四维降为二维,降成二维后排个序用树状数组维护下就好 ...

  9. COGS 2479. [HZOI 2016]偏序 [CDQ分治套CDQ分治 四维偏序]

    传送门 给定一个有n个元素的序列,元素编号为1~n,每个元素有三个属性a,b,c,求序列中满足i<j且ai<aj且bi<bj且ci<cj的数对(i,j)的个数. 对于100%的 ...

随机推荐

  1. 自动的自动化:EvoSuite 自动生成JUnit的测试用例

    EvoSuite简介 EvoSuite是由Sheffield等大学联合开发的一种开源工具,用于自动生成测试用例集,生成的测试用例均符合Junit的标准,可直接在Junit中运行.得到了Google和Y ...

  2. Python第四天 流程控制 if else条件判断 for循环 while循环

    Python第四天   流程控制   if else条件判断   for循环 while循环 目录 Pycharm使用技巧(转载) Python第一天  安装  shell  文件 Python第二天 ...

  3. java10.0.2和java 11.0.1配置环境变量

    java10.0.2 在网上找了各种方法一直也没配好打开jak下的lib文件夹发现并没有tools.jar,后经查询jdk-9后就没有了上述.jar文件所以我的配置方法如下 ClASSPATH C:\ ...

  4. c/c++ 继承与多态 引用有的时候并不能达到多态的效果

    继承与多态 引用有的时候并不能达到多态的效果 问题:c++ primer 第五版说,只有指针和引用调用虚函数时才会发生动态绑定(多态).实践一下,发现引用有的时候不能发生多态绑定(多态). 下面的例子 ...

  5. Linux垃圾清理

    一.删除缓存 1,非常有用的清理命令:sudo apt-get autoclean                清理旧版本的软件缓存sudo apt-get clean                ...

  6. MySql 学习之路-Date函数

    MySQL中重要的内建函数 函数 描述 NOW() 返回当前的日期和时间 NOW() 返回当前的日期和时间. 语法 NOW() -- 实例 -- 下面是 SELECT 语句: SELECT NOW() ...

  7. Postman安装与使用

    Postman一款非常流行的API调试工具.其实,开发人员用的更多.因为测试人员做接口测试会有更多选择,例如Jmeter.soapUI等.不过,对于开发过程中去调试接口,Postman确实足够的简单方 ...

  8. HBase源码实战:BufferedMutator

    /** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agr ...

  9. Kafka leader副本选举与消息丢失场景讨论

    如果某个broker挂了,leader副本在该broker上的分区就要重新进行leader选举.来简要描述下leader选举的过程 1.4.1 KafkaController会监听ZooKeeper的 ...

  10. Linux(CentOS)下设置nginx开机自动启动(2个办法)

    首先,在linux系统的/etc/init.d/目录下创建nginx文件,使用如下命令: vim /etc/init.d/nginx 在脚本中添加如下命令: #!/bin/sh # # nginx - ...