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学习笔记的更多相关文章

  1. CDQ 学习笔记

    CDQ分治 CDQ(陈丹琦)分治是一种特殊的分治方法. 它只能处理非强制在线的问题. CDQ分治在维护一些动态的凸包.半平面交问题也有一定应用,然而本渣渣并不会. CDQ分治基于时间分治,整体二分基于 ...

  2. 学习笔记 | CDQ分治

    目录 前言 啥是CDQ啊(它的基本思想) 例题 后记 参考博文 前言 博主太菜了 学习快一年的OI了 好像没有什么会的算法 更寒碜的是 学一样还不精一样TAT 如有什么错误请各位路过的大佬指出啊感谢! ...

  3. OI知识点|NOIP考点|省选考点|教程与学习笔记合集

    点亮技能树行动-- 本篇blog按照分类将网上写的OI知识点归纳了一下,然后会附上蒟蒻我的学习笔记或者是我认为写的不错的专题博客qwqwqwq(好吧,其实已经咕咕咕了...) 基础算法 贪心 枚举 分 ...

  4. 【框架】Django入门学习笔记

    教程 Demo 教材2 教材3 [转] Django处理请求的工作机制 记住: 1.用manage.py runserver 启动Django服务器时就载入了在同一目录下的settings.py.该文 ...

  5. 【学习笔记】动态规划—斜率优化DP(超详细)

    [学习笔记]动态规划-斜率优化DP(超详细) [前言] 第一次写这么长的文章. 写完后感觉对斜优的理解又加深了一些. 斜优通常与决策单调性同时出现.可以说决策单调性是斜率优化的前提. 斜率优化 \(D ...

  6. KD-Tree 学习笔记

    这是一篇又长又烂的学习笔记,请做好及时退出的准备. KD-Tree 的复杂度大概是 \(O(n^{1-\frac{1}{k}})\) \(k\) 是维度 由于网上找不到靠谱的证明,咕了. 会证明之后再 ...

  7. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  8. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  9. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

随机推荐

  1. wpf ListBox删除

    绑定一个GUID对象 重绑定的数组中移除改对象,重新绑定.

  2. Nginx编译安装(Centos)

    前言 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行.由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大 ...

  3. Android Studio解决未识别Java文件(出现红J)问题

    1.问题:java文件出现了红J的问题,正常情况下应该是显示蓝色的C标识. 2.解决方案:切换到project视图下,找到app这个module里的build.gradle,在android结构里插入 ...

  4. HTML Select 标签选择后触发jQuery事件代码实例

    页面设计原由: 因为很多客户不知道如何来到我们公司,领导想让我在微信公众号上面做一个链接,客户可以直接通过微信公众号打开地图并导航到我们公司的办公地点. 实现起来并不难,但由于公司有很多办事处,所以需 ...

  5. [老文章搬家] 关于 Huffman 编码

    按:去年接手一个项目,涉及到一个一个叫做Mxpeg的非主流视频编码格式,编解码器是厂商以源代码形式提供的,但是可能代码写的不算健壮,以至于我们tcp直连设备很正常,但是经过一个UDP数据分发服务器之后 ...

  6. Tomcat服务器配置以及相关配置文件介绍

    摘自:http://blog.163.com/ny_lonely/blog/static/18892427320136925044357/ context.xml 文件   配置属性说明     用于 ...

  7. MySQL自增ID 起始值 修改方法

    在mysql中很多朋友都认为字段为AUTO_INCREMENT类型自增ID值是无法修改,其实这样理解是错误的,下面介绍mysql自增ID的起始值修改与设置方法. 通常的设置自增字段的方法: 创建表格时 ...

  8. Javascript设计模式学习一

    学习Javascript设计模式之前,需要先了解一些相关知识,面向对象的基础知识.this等重要概念,以及掌握一些函数式编程的技巧. Js多态 多态的思想:实际上是把“做什么”和“谁去做”分离开来.例 ...

  9. socket.io简单入门(一.实现简单的图表推送)

    引子:随着nodejs蓬勃发展,虽然主要业务系统因为架构健壮性不会选择nodejs座位应用服务器.但是大量的内部系统却可以使用nodejs试水,大量的前端开发人员转入全堆开发也是一个因素. 研究本例主 ...

  10. python中不同包之间调用方法、

    在pycharm中... 当两个py文件在同一个文件夹下的时候.直接from 文件名 import *  即可 当两个文件在不同的文件夹下的时候.需要在文件中加入 _init_.py 文件.里面可以什 ...