三维偏序(陌上花开)

2023-11-12

题目描述

题解:

这是cdq分治模板题。

前置:cdq分治。

好像是一位大佬搞出来的神奇分治,可以直接干掉一层树形结构。

其实实现还是比较简单的。

对于区间(l,r),我们先处理(l,mid)和(mid+1,r),然后处理左右区间之间产生的影响。

具体顺序看题目而定。

比如本题,我们可以先令a有序,然后分治。

每次处理影响时先排序,然后双指针分别扫。

由于aj<=ai,bj<=bi,cj<=ci,我们在刚开始已经令a有序,所以在保证bj<=bi时将c扔到数据结构中(我用的是树状数组,线段树可以解决更多情况)。

然后每次加一下当前c的前缀和就行了。

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 100050
#define ll long long
inline int rd()
{
    int f=1,c=0;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){c=10*c+ch-'0';ch=getchar();}
    return f*c;
}
int n,k;
struct node
{
    int a,b,c,f,w;
    void read(){a=rd(),b=rd(),c=rd();}
}p[N],tmp[N];
bool cmp(node x,node y)
{
    if(x.a!=y.a)return x.a<y.a;
    if(x.b!=y.b)return x.b<y.b;
    return x.c<y.c;
}
struct BIT
{
    int g[N<<1];
    void up(int x,int d)
    {
        if(!x)return ;
        while(x<=200000)
        {
            g[x]+=d;
            x+=(x&(-x));
        }
    }
    int down(int x)
    {
        if(!x)return 0;
        int ret = 0;
        while(x)
        {
            ret+=g[x];
            x-=(x&(-x));
        }
        return ret;
    }
}bit;
void Sort(int l,int r)
{
    int mid = (l+r)>>1;
    int i = l,j = mid+1,k = l;
    while(i<=mid&&j<=r)
    {
        while(p[i].b<=p[j].b&&i<=mid&&j<=r)
        {
            tmp[k] = p[i];
            i++,k++;
        }
        while(p[i].b>p[j].b&&i<=mid&&j<=r)
        {
            tmp[k] = p[j];
            j++,k++;
        }
    }
    while(i<=mid)
    {
        tmp[k]=p[i];
        i++,k++;
    }
    while(j<=r)
    {
        tmp[k]=p[j];
        j++,k++;
    }
    for(i=l;i<=r;i++)p[i]=tmp[i];
}
int ans[N];
void cdq(int l,int r)
{
    if(l==r)return ;
    int mid = (l+r)>>1;
    cdq(l,mid);cdq(mid+1,r);
    int i,j;
    for(i=l,j=mid+1;j<=r;j++)
    {
        while(p[i].b<=p[j].b&&i<=mid)
        {
            bit.up(p[i].c,p[i].w);
            i++;
        }
        p[j].f+=bit.down(p[j].c);
    }
    for(i=i-1;i>=l;i--)bit.up(p[i].c,-p[i].w);
    Sort(l,r);
}
bool vmp(node x,node y)
{
    return x.a==y.a&&x.b==y.b&&x.c==y.c;
}
int main()
{
    n=rd(),k=rd();
    for(int i=1;i<=n;i++)
        tmp[i].read();
    sort(tmp+1,tmp+1+n,cmp);
    int k=0;
    tmp[0].a=-1;
    for(int i=1;i<=n;i++)
    {
        if(vmp(tmp[i],tmp[i-1]))
        {
            p[k].w++;
        }else
        {
            k++;
            p[k] = tmp[i];
            p[k].w = 1;
        }
    }
    cdq(1,k);
    for(int i=1;i<=k;i++)ans[p[i].f+p[i].w-1]+=p[i].w;
    for(int i=0;i<n;i++)
        printf("%d\n",ans[i]);
    return 0;
}

 

转载于:https://www.cnblogs.com/LiGuanlin1124/p/10143270.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

三维偏序(陌上花开) 的相关文章

  • C语言/C++实现栈操作

    一 栈的概念 栈是一种常用的数据结构 它遵循先入后出 Last In First Out LIFO 的原则 栈的操作只在栈的一端进行 该端被称为栈顶 而另一端称为栈底 栈的基本操作包括压栈 入栈 push 和弹栈 出栈 pop 分别用于将元
  • 数据库多维迭代算法

    关键词 数据库 迭代 递归 多维 一 两种传统的数据库迭代结构算法 对于数据库的迭代结构 有两种传统的算法 递归算法和边界算法 比如对于下面图1的结构 图1 递归算法的数据结构如表1所示 节点id 节点值 父节点id 1 1111 2 3
  • 《Linux From Scratch》第三部分:构建LFS系统 第六章:安装基本的系统软件- 6.29. Coreutils-8.23...

    Coreutils 软件包包含用于显示和设置基本系统特性的工具 大概编译时间 2 5 SBU 需要磁盘空间 193 MB 6 29 1 安装 Coreutils POSIX 要求 Coreutils 中的程序即使在多字节语言环境也能正确识别
  • Sort List

    Sort a linked list in O n log n time using constant space complexity 题目要求用 O n log n 的时间复杂度和常数的空间复杂度来进行链表排序 O nlogn 的排序算
  • LeetCode83: 删除排序链表中的重复元素

    给定一个已排序的链表的头 head 删除所有重复的元素 使每个元素只出现一次 返回 已排序的链表 示例 1 输入 head 1 1 2 输出 1 2 示例 2 输入 head 1 1 2 3 3 输出 1 2 3 提示 链表中节点数目在范围
  • 第二十八节、基于深度学习的目标检测算法的综述(附代码,并附有一些算法英文翻译文章链接))...

    在前面几节中 我们已经介绍了什么是目标检测 以及如何进行目标检测 还提及了滑动窗口 bounding box 以及IOU 非极大值抑制等概念 这里将会综述一下当前目标检测的研究成果 并对几个经典的目标检测算法进行概述 本文内容来自基于深度学
  • Qt——用于表格QTableView的模型

    如果想使用表格来呈现数据 Qt提供了一个方便的部件QTableWidget 但是直接用它实现一些功能可能比较困难 这里将介绍一种强大 灵活的方式来操作表格 一 模型 视图架构 在这个架构中 模型用于存储数据 视图用于呈现数据 除此之外 还有
  • Hash table and application in java

    查找的效率取决于在查找是比较的次数 次数越少效率越高 反之越低 最理想的情况是无需比较 一次存取便能找到所查找的记录 根据对应关系f找到给定值K的像f K hash function 应运而生 由此思想建的表称为hash table 集合h
  • 如何根据链表节点数据大小对链表节点进行排序

    对链表排序有两种方法 1 比较了两个节点的大小后 对指针进行改变 从而交换节点的顺序 2 比较了两个节点的大小后 只交换数据域 而不改变指针 从而交换节点的顺序 第二种办法比较简单 本文主要对第二种方法进行讲解 链表节点排序算法 采用 冒泡
  • UE4命令行使用,解释

    命令行在外部 从命令行运行编辑项目 1 导航到您的 LauncherInstall VersionNumber Engine Binaries Win64 目录中 2 右键单击上 UE4Editor exe 的可执行文件 并选择创建快捷方式
  • 图 - Java实现无向带权图的邻接矩阵表示法

    图 Java实现无向带权图的邻接矩阵表示法 1 图 1 1 图的介绍 图 Graph 是一种复杂的非线性表结构 图中的元素我们就叫做顶点 vertex 图中的一个顶点可以与任意其他顶点建立连接关系 我们把这种建立的关系叫做边 edge 跟顶
  • 数据结构——计算节点个数和二叉树高度(C语言版)

    摘自 数据结构 计算节点个数和二叉树高度 C语言版 作者 正弦定理 发布时间 2020 12 12 23 27 09 网址 https blog csdn net chinesekobe article details 111086664
  • 如何防止过拟合和欠拟合

    过拟合和欠拟合是模型训练过程中经常出现的问题 两种情况正好相反 现将两者的定义及如何防止进行简要总结 1 过拟合 1 1 定义 是指模型对于训练数据拟合呈现过当的情况 反映到评估指标上就是模型在训练集上的表现很好 但是在测试集上的表现较差
  • 算法问题实战策略

    算法问题实战策略 基本信息作者 韩 具宗万 译者 崔盛一出版社 人民邮电出版社ISBN 9787115384621上架时间 2015 2 4出版日期 2015 年3月开本 16开页码 738版次 1 1 内容简介 算法问题实战策略 本书收录
  • 用指针访问一维数组

    文章目录 顺序查找 数组方式实现 指针实现方式 对一位数组元素的访问有三种方式 指针变量的关系运算 引例 数组实现方式 主函数 指针实现方式 主函数 一维数组作为函数的参数 实际应用 顺序查找 要求用指针实现 在整数集合r中顺序查找与给定值
  • 数据结构与算法-列表(双向链表)设计及其排序算法

    0 概述 本文主要涵盖列表 双向链表 的设计及其排序算法的总结 列表是一种典型的动态存储结构 其中的数据 分散为一系列称作节点 node 的单位 节点之间通过指针相互索引和访问 为了引入新节点或删除原有节点 只需在局部调整少量相关节点之间的
  • 数理统计知识整理——回归分析与方差分析

    题记 时值我的北科研究生第一年下 选学 统计优化 课程 备考促学 成此笔记 以谨记 1 线性回归 1 1 原理分析 要研究最大积雪深度x与灌溉面积y之间的关系 测试得到近10年的数据如下表 使用线性回归的方法可以估计x与y之间的线性关系 线
  • Linux下进程退出的几种形式

    进程退出 Linux 下进程的退出分为正常退出和异常退出两种 1 正常退出 a 在main 函数中执行return b 调用exit 函数 c 调用 exit 函数 2 异常退出 a 调用about函数 b 进程收到某个信号 而该信号使程序
  • 数组实现循环队列(增设队列大小size)

    目录 一 前言 1 如何实现循环 2 如何判断队列为空 3 如何判断队列为满 二 循环队列的结构定义 三 循环队列的创建及其初始化 四 入队 五 出队 六 取队头元素 七 取队尾元素 八 循环队列判空 九 循环队列判满 十 循环队列销毁 一
  • 最大流-Dinic算法,原理详解,四大优化,详细代码

    文章目录 零 前言 一 概念回顾 可略过 1 1流网络 1 2流 1 3最大流 1 4残留网络 1 5增广路

随机推荐

  • linux 动态库搜索路径优先顺序以及Makefile 编译设置

    一 linux 下 动态库搜索路径优先顺序 编译目标代码时指定的动态库搜索路径 环境变量LD LIBRARY PATH指定的动态库搜索路径 配置文件 etc ld so conf中指定的动态库搜索路径 配置后要运行 ldconfig命令才能
  • ACK打击是什么意思?ACK打击怎么防御?

    ACK Flood打击是TCP连接建立之后 所有传输的TCP报文都是带有ACK标志位的数据包 接收端在收到一个带有ACK标志位的数据包的时候 需要检查该数据包所表示的连接四元组是否存在 如果存在则检查该数据包所表示的状态是否合法 然后再向应
  • 爬虫项目实战十四:爬取慕课课程

    爬取慕课学校云课程 目标 项目准备 项目分析 代码实现 完整代码 效果显示 目标 爬取慕课学校云的课程信息 项目准备 软件 Pycharm 第三方库 requests 网站地址 https www icourse163 org 项目分析 首
  • 如何将Springboot项目升级成Springcloud项目(有图详解)

    本文以nacos为例 分为以下几个步骤 1 下载nacos软件 2 pom文件配置 3 application yml文件配置 4 代码调用 5 效果展示 一 下载nacos软件 1 1 下载nacos server 2 2 0 BETA这
  • Could not transfer metadata org.apache.maven.plugins/maven-metadata.xml from

    原因 从阿里云镜像仓库下载不了依赖文件 解决办法 1 在IDEA里面 File gt Settings gt Build Execution Deployment gt Build Tools gt Maven gt Runner 的VM
  • Allegro如何将好几块同一网络敷铜合并在一起

    1 如题 如下图圈起来的地方是三个同一网络的敷铜 2 点击Shape Merge shapes 将上图中的三个腹铜圈起来 然后右键done 就合并成了一个敷铜
  • vue模拟锚点定位加动画

    模拟锚点跳转 goAnchor selector let anchor this el querySelector selector document documentElement scrollTop anchor offsetTop l
  • 质数

    include
  • 0x0000007B:A problem has been detected and windows has been shut down to prevent damage to your Comp

    0x0000007B 这个代码和硬盘有关系 不过不用害怕 不是有坏道了 是设置问题或者病毒造成的硬盘引导分区错误 如果您在用原版系统盘安装系统的时候出这个问题 那说明您的机器配置还是比较新的 作为老的系统盘 不认这么新的硬盘接口 所以得进B
  • ARKit和SceneKit

    ARKit SceneKit 首先看一下官方描述 学习ios开发真的要多看原文档 帮助很大 ARKit 整合iOS设备相机和运动功能 在您的应用程序或游戏中产生增强现实体验 SceneKit 使用高级场景描述创建3D游戏并将3D内容添加到应
  • 自学网络安全详细路线图来了

    大家好 我是轩辕 上一次的 C C 后端开发路线图 的末尾 预告了网络安全方向的学习路线 让大家久等了 今天终于来了 算上从学校开始学习 轩辕已经在网安这条路上走了10年了 无论是以前在学校做安全研究 还是毕业后在百度 360从事内核安全产
  • sklearn基础学习笔记

    本文对scikit learn中常用的class 和function做一个总结 一 sklearn cluster 聚类算法 class cluster KMeans n clusters init n init KMeans n clus
  • UML类图符号 各种关系说明以及举例

    转自 http www cnblogs com duanxz archive 2012 06 13 2547801 html UML中描述对象和类之间相互关系的方式包括 依赖 Dependency 关联 Association 聚合 Agg
  • 网络安全基础要点知识介绍

    本文章只为了方便查阅 文章目录 网络安全 网络安全问题概述 两类密码体制 数字签名 鉴别 报文鉴别 实体鉴别 密钥分配 对称密钥的分配 公钥的分配 互联网使用的安全协议 运输层安全协议 参考文献 网络安全 网络安全问题概述 计算机网络的通信
  • 真题详解(数字签名算法)-软件设计(七十八)

    真题详解 有限自动机 软件设计 七十七 https blog csdn net ke1ying article details 130748759 可用于数字签名算法的是 答案 非对称RSA 移植性 易安装 易替换 适应性 UML状态图转换
  • P16-Login.vue内容

  • Java 中时间类 Calendar、Date、SimpleDateFormat 的相关详解

    参考Java 1 8 文章目录 java util Date methods java util Calendar methods Calendar 方法举例 java text SimpleDateFormat 符号对应的意思 构造方法
  • vue实现一行多列的表单校验

    背景 在开发过程中 经常会遇到一行多列的情况 并且需要做表单校验 element文档给的required案列是单列输入框 使用场景不符合动态一行多列验证 第一种方式 一个表单 循环多行 代码
  • redis模糊批量清除key

    文章目录 一 命令行删除 二 golang代码删除 有时候需要从 Redis 实例成千上万的 key 中找出特定前缀的 key 列表来手动处理数据 可能是修改它的值 也可能是删除 key 这里就有一个问题 如何从海量的 key 中找出满足特
  • 三维偏序(陌上花开)

    题目描述 题解 这是cdq分治模板题 前置 cdq分治 好像是一位大佬搞出来的神奇分治 可以直接干掉一层树形结构 其实实现还是比较简单的 对于区间 l r 我们先处理 l mid 和 mid 1 r 然后处理左右区间之间产生的影响 具体顺序