cogs2479 偏序(CDQ套CDQ)
思路
四维偏序
\(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)的更多相关文章
- [HZOI 2016] 偏序(CDQ套CDQ)
传送门 思路: 就是cdq套cdq的模板题 #include <bits/stdc++.h> using namespace std; typedef long long ll; cons ...
- HDU - 5126: stars (求立方体内点数 CDQ套CDQ)
题意:现在给定空空的三维平面,有加点操作和询问立方体点数. 思路:考虑CDQ套CDQ.复杂度是O(NlogN*logN*logN),可以过此题. 具体的,这是一个四维偏序问题,4维分别是(times, ...
- HDU5126---stars (CDQ套CDQ套 树状数组)
题意:Q次操作,三维空间内 每个星星对应一个坐标,查询以(x1,y1,z1) (x2,y2,z2)为左下顶点 .右上顶点的立方体内的星星的个数. 注意Q的范围为50000,显然离散化之后用三维BIT会 ...
- 四维偏序 CDQ套CDQ
对CDQ深一步的理解 昨天做了一道CDQ,看了一堆CDQ可做的题,今天又做了一道四维偏序 感觉对CDQ的理解又深了一点,故来写一写现在自己对于CDQ的理解 CDQ其实就是实现了这样的一个问题的转化: ...
- 【教程】CDQ套CDQ——四维偏序问题
前言 上一篇文章已经介绍了简单的CDQ分治,包括经典的二维偏序和三维偏序问题,还有带修改和查询的二维/三维偏序问题.本文讲介绍多重CDQ分治的嵌套,即多维偏序问题. 四维偏序问题 给定N( ...
- HDU 5126 stars 4维偏序, CDQ套CDQ
题目传送门 题意:在一个星空中,按着时间会出现一些点,现在john想知道,在某个时间内有多少个星星是的坐标是满足条件的.(x1<=x<=x2, y1 <= y <= y2, z ...
- COGS 2479. [HZOI 2016] 偏序 (CDQ套CDQ)
传送门 解题思路 四维偏序问题,模仿三维偏序,第一维排序,第二维CDQ,最后剩下二元组,发现没办法处理,就继续嵌套CDQ分治.首先把二元组的左右两边分别打上不同的标记,因为统计答案时只统计左边对右边的 ...
- hdu 5126 stars (四维偏序,离线,CDQ套CDQ套树状数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5126 思路:支持离线,那么我们可以用两次CDQ分治使四维降为二维,降成二维后排个序用树状数组维护下就好 ...
- COGS 2479. [HZOI 2016]偏序 [CDQ分治套CDQ分治 四维偏序]
传送门 给定一个有n个元素的序列,元素编号为1~n,每个元素有三个属性a,b,c,求序列中满足i<j且ai<aj且bi<bj且ci<cj的数对(i,j)的个数. 对于100%的 ...
随机推荐
- 【自动化测试&爬虫系列】Selenium Webdriver
文章来源:公众号-智能化IT系统. 一. Selenium Webdriver技术介绍 1. 简介 selenium Webdriver是一套针对不同浏览器而开发的web应用自动化测试代码库.使用这套 ...
- Kubernetes Dashboard - 每天5分钟玩转 Docker 容器技术(173)
前面章节 Kubernetes 所有的操作我们都是通过命令行工具 kubectl 完成的.为了提供更丰富的用户体验,Kubernetes 还开发了一个基于 Web 的 Dashboard,用户可以用 ...
- geth搭建私有网络
geth --rpc --unlock "3ae88fe370c39384fc16da2c9e768cf5d2495b48,81063419f13cab5ac090cd8329d8fff9f ...
- c/c++ 重载运算符 类型转换运算符
重载运算符 类型转换运算符 问题:能不能把一个类型A的对象a,转换成另一个类型B的对象b呢?? 是可以的.这就必须要用类型A的类型转换运算符(conversion operator) 下面的opera ...
- 炫龙炎魔T1笔记本 Win7 系统安装
系统链接:https://pan.baidu.com/s/1T5FdJf1jhTj78vEBYCXxyA 密码:rl7m 1.制作系统盘(下载文件中有教程),插好U盘,重启计算机 2.按F2进入BOS ...
- python——python3.6环境搭建(Windows10,64位)
1.python软件资源下载 1.1 打开python官网地址:https://www.python.org 1.2 根据自己电脑的设置选择下载合适的python3.6.2 1.3 此处选择windo ...
- LeetCode算法题-Number Complement(Java实现-五种解法)
这是悦乐书的第240次更新,第253篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第107题(顺位题号是476).给定正整数,输出其补码数.补充策略是翻转其二进制表示的位 ...
- Myeclipse、eclipse安装lombok
Lombok简介 Lombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法.官方地址:https:/ ...
- 【Linux基础】mount报错:mount.nfs: Remote I/O error
问题描述:mount 报错:mount.nfs: Remote I/O error 挂载时需要指明版本,由于NFS服务器有多个版本,V2.V3.V4.而且各版本同时运行,因此挂载时需要说明版本号. 由 ...
- spark-RDD源码分析
http://stark-summer.iteye.com/blog/2178096 RDD的核心方法: 首先看一下getPartitions方法的源码: getPartitions返回的是一系列pa ...