CDQ学习笔记
CDQ三维偏序
给出n个点(x,y,z)
每个点求出x'<=x,y'<=x,z'<=x的点(x',y',z')有多少个
第一维 快排 第二维 CDQ 第三维 树状数组
CDQ
先按x第一关键字,y第二关键字,z第三关键字快排
CDQ先处理左半边,再处理右半边
现在满足左半边的x全部小于右半边的x
那就只用考虑y,z
将左半边的y排序,右半边的y排序
像two-pionter那样扫一下用树状数组维护z
为了节省时间不清空树状数组开个时间戳
对于相等权值需要特判的,cdq全部算完之后再按一开始那样快排
从后往前扫一遍用后面的更新前面
快排
wa了7发,第一次知道快排是左闭右开区间
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cctype>
using namespace std;
typedef long long LL;
const int M=100007;
inline int rd(){
int x;
scanf("%d",&x);
return x;
}
int tcas;
int n;
int ans[M];
int tms[M];
int c[M];
int T;
struct node{
int x,y,z,id,dp;
void input(int ii){x=rd(),y=rd(),z=rd(),id=ii;dp=0;}
}a[M];
bool operator ==(node x,node y){
return x.x==y.x&&x.y==y.y&&x.z==y.z;
}
bool cmp(node x,node y){
if(x.x==y.x&&x.y==y.y)return x.z<y.z;
if(x.x==y.x)return x.y<y.y;
return x.x<y.x;
}
bool cmpx(node x,node y){return x.x<y.x;}
bool cmpy(node x,node y){return x.y<y.y;}
inline int lb(int x){return x&(-x);}
void ins(int x,int d){
for(;x<M;x+=lb(x)){
if(tms[x]!=T) {c[x]=0;tms[x]=T;}
c[x]+=d;
}
}
int get(int x){
int res=0;
for(;x>0;x-=lb(x)){
if(tms[x]==T) res+=c[x];
}
return res;
}
void calc(int l,int r){
if(l==r)return;
int i,j,mid=l+r>>1;
calc(l,mid);
calc(mid+1,r);
sort(a+l,a+mid+1,cmpy);
sort(a+mid+1,a+r+1,cmpy);
T++;
for(i=l,j=mid+1;j<=r;j++){
for(;a[i].y<=a[j].y&&i<=mid;i++){
ins(a[i].z,1);
}
a[j].dp+=get(a[j].z);
}
}
int main(){
int i;
tcas=rd();
while(tcas--){
n=rd();
for(i=1;i<=n;i++) a[i].input(i);
sort(a+1,a+n+1,cmp);
calc(1,n);
sort(a+1,a+n+1,cmp);
for(i=n-1;i>0;i--) if(a[i]==a[i+1]) a[i].dp=a[i+1].dp;
for(i=1;i<=n;i++) ans[a[i].id]=a[i].dp;
for(i=1;i<=n;i++) printf("%d\n",ans[i]);
}
return 0;
}
CDQ学习笔记的更多相关文章
- CDQ 学习笔记
CDQ分治 CDQ(陈丹琦)分治是一种特殊的分治方法. 它只能处理非强制在线的问题. CDQ分治在维护一些动态的凸包.半平面交问题也有一定应用,然而本渣渣并不会. CDQ分治基于时间分治,整体二分基于 ...
- 学习笔记 | CDQ分治
目录 前言 啥是CDQ啊(它的基本思想) 例题 后记 参考博文 前言 博主太菜了 学习快一年的OI了 好像没有什么会的算法 更寒碜的是 学一样还不精一样TAT 如有什么错误请各位路过的大佬指出啊感谢! ...
- OI知识点|NOIP考点|省选考点|教程与学习笔记合集
点亮技能树行动-- 本篇blog按照分类将网上写的OI知识点归纳了一下,然后会附上蒟蒻我的学习笔记或者是我认为写的不错的专题博客qwqwqwq(好吧,其实已经咕咕咕了...) 基础算法 贪心 枚举 分 ...
- 【框架】Django入门学习笔记
教程 Demo 教材2 教材3 [转] Django处理请求的工作机制 记住: 1.用manage.py runserver 启动Django服务器时就载入了在同一目录下的settings.py.该文 ...
- 【学习笔记】动态规划—斜率优化DP(超详细)
[学习笔记]动态规划-斜率优化DP(超详细) [前言] 第一次写这么长的文章. 写完后感觉对斜优的理解又加深了一些. 斜优通常与决策单调性同时出现.可以说决策单调性是斜率优化的前提. 斜率优化 \(D ...
- KD-Tree 学习笔记
这是一篇又长又烂的学习笔记,请做好及时退出的准备. KD-Tree 的复杂度大概是 \(O(n^{1-\frac{1}{k}})\) \(k\) 是维度 由于网上找不到靠谱的证明,咕了. 会证明之后再 ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
随机推荐
- django 关于html、css、js 目录位置
项目目录: project/ ---------------init.py ---------------views.py ---------------settings.py ----------- ...
- linux系统下使用xampp 丢失mysql root密码【xampp的初始密码为空】
如果在ubuntu 下面 使用xampp这个集成开发环境,却忘记mysql密码. 注:刚安装好的xampp的Mysql初始密码是空... 找回密码的步骤如下: 1.停止mysql服务器 sudo /o ...
- js数组方法
数组方法清空数组1: arr.length=02: arr=[]arr.push()//往数组最后一个添加元素,会待会一个返回值,就是新的数组长度arr.unshift()//往数组的第一个添加元素, ...
- EasyPusher应用
转自https://github.com/EasyDarwin/EasyPusher 本文仅实际体验一下demo,分析一下如何应用. 1)EasyPusher框图预览 2) EasyPusher应用实 ...
- 看着水了一天的群,终于看到一段高质量的代码了分享一下localStorage
_history : { //缓存 isLocalStorage:window.localStorage?true:false, set : function(key,value){ //设置缓存 i ...
- mysql数据库存储路径更改 数据文件位置
使用了VPS一段时间之后发现磁盘空间快满了.本人的VPS在购买的时候买了500gb的磁盘,提供商赠送了20GB的高性能系统磁盘.这样系统就有两个磁盘空间了.在初次安装mysql 的时候将数据库目录安装 ...
- COM 组件基础——GUID 和 接口
一.前言 书接上回,话说在 doc(Word) 复合文件中,已经解决了保存 xls(Excel) 数据的问题了.那么,接下来又要解决另一个问题:当 WORD 程序读取复合文件,遇到了 xls 数据的时 ...
- BLAST套件
Blastn是将给定的核酸序列与核酸数据库中的序列进行比较: Blastp是使用蛋白质序列与蛋白质数据库中的序列进行比较,可以寻找较远的关系: Blastx将给定的核酸序列按照六种阅读框架将其翻译成蛋 ...
- JavaScript生成新标签的三个方法(摘抄自留)
<div id="d1"></div> <script> //HTML function a(){ document.getElementByI ...
- [ActiveMQ]初识ActiveMQ
初识ActiveMQ ActiveMQ介绍 官方网站:http://activemq.apache.org/ 最新版本:ActiveMQ 5.14.1(2016-10-28) 最新版本下载链接:htt ...