递增三元组(第九届蓝桥杯)

文章目录

        • 题目
        • 原题链接
        • 思路分析
        • 二分做法1
        • 二分做法2
        • 双指针做法
        • 前缀和解法

题目

在这里插入图片描述

原题链接

递增三元组

思路分析

由时间复杂度可知需要至少优化到 O ( n l o g n ) O(nlogn) O(nlogn)才行
而纯暴力枚举三个数组的话: O ( n 3 ) O(n^3) O(n3)
可以考虑将b[]作为标志,枚举a[]中小于b[i]的和c[]中大于b[i]
既然是查找
这种类型的题目可以想到用二分或者双指针来降低枚举的时间复杂度

二分做法1
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 100010;
int a[N], b[N], c[N];
int n;
bool check_a(int mid, int x) {
    if(a[mid] < x) return true;
    else return false;
}
bool check_c(int mid, int x) {
    if(c[mid] > x) return true;
    else return false;
}
int main() {
    cin >> n;
    for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
    for(int i = 1; i <= n; i++) scanf("%d", &b[i]);    
    for(int i = 1; i <= n; i++) scanf("%d", &c[i]);
    sort(a + 1, a + 1 + n);
    sort(b + 1, b + 1 + n);
    sort(c + 1, c + 1 + n);
    LL res = 0;
    for(int i = 1; i <= n; i++) {   //以b[]为参照物
        int st = 0, ed = 0;
        int la = 1, ra = n, lc = 1, rc  = n;
        while(la < ra) {
            int mid = la + ra + 1 >> 1;
            if(check_a(mid, b[i]))    la = mid;
            else ra = mid - 1;
        }
        if(a[ra] < b[i])     st = ra;
        while(lc < rc) {
            int mid = lc + rc >> 1;
            if(check_c(mid, b[i]))  rc = mid;
            else lc = mid + 1;
        }
        if(c[rc] > b[i])    ed = n - rc + 1;
        res += (LL)st * ed;
    }
    printf("%lld", res);
    return 0;
}
二分做法2

上方的只需要变动这块就行,直接调用库函数

    for(int i = 1; i <= n; i++) {   //以b[]为参照物
        int st = 0, ed = 0;
        int la = 1, ra = n, lc = 1, rc  = n;
        // while(la < ra) {
        //     int mid = la + ra + 1 >> 1;
        //     if(check_a(mid, b[i]))    la = mid;
        //     else ra = mid - 1;
        // }
        // if(a[ra] < b[i])     st = ra;
    //要想找第一个小于的,那么可用第一个大于等于的-1
        st = lower_bound(a + 1, a + 1 + n, b[i]) - a - 1;
        // while(lc < rc) {
        //     int mid = lc + rc >> 1;
        //     if(check_c(mid, b[i]))  rc = mid;
        //     else lc = mid + 1;
        // }
        // if(c[rc] > b[i])    ed = n - rc + 1;
    //找第一个大于的可直接用upper
        ed = n - (upper_bound(c + 1, c + n + 1, b[i]) - c) + 1;
        res += (LL)st * ed;
    }
双指针做法
//双指针,只需修改上方为下面这样即可
int l = 1, r = 1;
for(int i = 1; i <= n; ++i) {
    while(a<=n && a[l] < b[i]) l++;
    while(c<=n && c[r] <= b[i]) r++;

    ans += (LL)(l-1)*(n-r+1);
}
前缀和解法

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 100010;
int n;
int a[N],b[N],c[N];
int as[N];  //as[N]表示在A[]中有多少个数小于b[i]
int cs[N];  //cs[N]表示在C[]中有多少个数小于b[i]
int cnt[N],s[N]; //s[i]表示1~i之间的数的数量

int main()
{
    cin >> n;
    long long res = 0;
    //a,b,c++的目的是为了范围从1开始,以便后续使用前缀和
    for(int i = 0;i < n;i++)    scanf("%d",&a[i]),a[i]++;
    for(int i = 0;i < n;i++)    scanf("%d",&b[i]),b[i]++;
    for(int i = 0;i < n;i++)    scanf("%d",&c[i]),c[i]++;
   
   //求as[i]
   for(int i = 0;i < n;i++) cnt[a[i]]++;    //某个数的数量
   for(int i = 1;i < N;i++) s[i] = s[i-1] + cnt[i]; //前缀和
   for(int i = 0;i < n;i++) as[i] = s[b[i] - 1];    //1到b[i]之间的数的数量
   
   //求cs[i]
    memset(cnt,0,sizeof cnt);   //将cnt重置为0
    memset(s,0,sizeof s);       //将s重置为0
    for(int i = 0;i < n;i++)    cnt[c[i]]++;
    for(int i = 1;i < N;i++)    s[i] = s[i-1] + cnt[i];
    for(int i = 0;i < n;i++)    cs[i] = s[N-1] - s[b[i]];
       
   //枚举每个b[i]
    for(int i = 0;i < n;i++)    res += (long long)as[i] * cs[i];
 
    cout << res << endl;
    
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/436016.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

28000MB 是多少GB 内存?怎么清理内存空间?

在计算机领域&#xff0c;我们经常会听到关于存储容量的单位&#xff0c;如 MB&#xff08;兆字节&#xff09;和 GB&#xff08;千兆字节&#xff09;。如果您在处理计算机内存或存储空间时遇到了 28000MB 这样的容量&#xff0c;您可能会想知道它相当于多少GB。本文将为您解答…

在win10中下载桌面版的docker并在docker中搭建运行基于linux的容器

在win10中下载桌面版的docker 1.背景 在很多时候需要linux系统部署项目&#xff0c;在win10中安装虚拟机并在虚拟机中安装linux系统比较繁琐&#xff0c;可以利用win10自带的hyper-v的虚拟机管理工具&#xff0c;打开该虚拟机管理工具&#xff0c;安装docker&#xff0c;并在…

压测工具jmeter使用

目录 下载 解压 修改配置 启动模拟发送请求 下载 解压 修改配置 启动 下载地址&#xff1a;https://archive.apache.org/dist/jmeter/binaries/ 参考文章&#xff1a;https://www.cnblogs.com/Uni-Hoang/p/15573606.html 一般下zip版本&#xff0c;如apache-jmeter-5.2.1.zip …

ALLegro之单独设置PIN脚与覆铜连接方式

​ 设计PCB时,有很多时候在总电源输入处需要将一部分pin脚设置为全连接,给大电流拓宽通道。然而如果往常针对同一覆铜下的同属性pin脚只能全部设置为全连接或者其他。所以,在初学者手上也出现了“投机份子”,先给全部覆铜改成统一的常规模式,比如十字连接,然后转换成静态…

八、西瓜书——特征选择与稀疏学习

1.子集搜索与评价 对于1个学习任务来说,给定属性集,其中有些属性可能很关键、很有用&#xff0c;另一些属性则可能没什么用&#xff0c;我们将属性称为“特征”(feature),对当前学习任务有用的属性称为“相关特征”(relevant feature)、没什么用的属性称为“无关特征”(irrelev…

基于springboot的车辆充电桩管理系统(系统+数据库+文档)

** &#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;** 一、研究背景…

航天民芯一级代理 MT3608 MT3608L 升压转换器 1.2MHZ

MT3608/MT3608L是恒定频率的6引脚SOT23电流模式升压转换器&#xff0c;适用于小型、低功耗应用。MT3608在1.2MHz&#xff0c;允许使用微小、低成本的频率高度不超过2mm的电容器和电感器。内部软启动可实现较小的浪涌电流和延长电池寿命。MT3608具有自动切换到脉冲的功能轻负载下…

CGAL 5.6.1 - Algebraic Foundations

1. 引言 CGAL 的目标是精确计算非线性对象&#xff0c;特别是定义在代数曲线和曲面上的对象。因此&#xff0c;表示多项式、代数扩展和有限域的类型在相关的实现中扮演着更加重要的角色。为了跟上这些变化&#xff0c;我们引入了这个软件包。由于引入的框架必须特别支持多项式…

安卓玩机工具推荐----高通芯片9008端口读写分区 备份分区 恢复分区 制作线刷包 工具操作解析

上期解析了下adb端口备份分区的有关操作 安卓玩机工具推荐----ADB状态读写分区 备份分区 恢复分区 查看分区号 工具操作解析 在以往的博文中对于高通芯片机型的分区读写已经分享了很多。相关类似博文 安卓备份分区----手动查询安卓系统分区信息 导出系统分区的一些基本操作 …

前端实现一个绕圆心转动的功能

前言&#xff1a; 今天遇到了一个有意思的需求&#xff0c;如何实现一个元素绕某一个点来进行圆周运动&#xff0c;用到了一些初高中的数学知识&#xff0c;实现起来还是挺有趣的&#xff0c;特来分享&#x1f381;。 一. 效果展示 我们先展示效果&#xff0c;如下图所示&…

【NR 定位】3GPP NR Positioning 5G定位标准解读(六)

前言 3GPP NR Positioning 5G定位标准&#xff1a;3GPP TS 38.305 V18 3GPP 标准网址&#xff1a;Directory Listing /ftp/ 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;一&#xff09;-CSDN博客 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;…

JavaScript基础Ⅱ

目录 第2章 JavaScript基础语法(掌握) 11-JS代码调试 12-JS函数 第3章 JS事件 14-事件的绑定方式 常用事件(了解) 15-常用事件 第4章 JS内置对象(掌握) 16-数组 17-日期 18-数学运算 19-数字 20-全局函数 第2章 JavaScript基础语法(掌握) 11-JS代码调试 12-JS函数…

青少年如何从零开始学习Python编程?有它就够了!

文章目录 写在前面青少年为什么要学习编程 推荐图书图书特色内容简介 推荐理由粉丝福利写在最后 写在前面 本期博主给大家带来一本非常适合青少年学习编程的图书&#xff0c;快来看看吧~ 青少年为什么要学习编程 青少年学习编程&#xff0c;就好比在他们年轻时就开始掌握一种…

基于单片机的医院输液系统设计

目 录 摘 要 Ⅰ Abstract Ⅱ 引 言 1 1系统方案设计与论证 3 1.1系统硬件结构总体设计方案 3 1.2点滴速度测量电路方案的选择与论证 3 1.3液面检测电路方案的选择与论证 4 1.4通过电机控制滴速电路的方案与论证 4 1.5显示器接口电路方案选择与论证 5 1.6键盘接口电路方案选择与…

1.2_3 TCP/IP参考模型

文章目录 1.2_3 TCP/IP参考模型&#xff08;一&#xff09;OSI参考模型与TCP/IP参考模型&#xff08;二&#xff09;5层参考模型&#xff08;三&#xff09;5层参考模型的数据封装与解封装 1.2_3 TCP/IP参考模型 &#xff08;一&#xff09;OSI参考模型与TCP/IP参考模型 TCP/I…

Xilinx 7系列 FPGA硬件知识系列(一)——FPGA选型参考

目录 1.1 Xilinx-7系列产品的工艺级别 ​编辑1.2 Xilinx-7系列产品的特点 1.2.1 Spartan-7系列 1.2.2 Artix-7系列 1.2.3 Kintex-7系列 1.2.4 Virtex-7系列 1.3 Xilinx-7系列FPGA对比 1.3.1 DSP资源柱状图 ​1.3.2 Block RAM资源柱状图 ​1.3.3 高速串行收…

Neoverse CSS N3:实现市场领先能效的最快途径

区分老的架构 从云到边缘&#xff0c;Arm Neoverse 提供无与伦比的性能、效率、设计灵活性和 TCO 优势&#xff0c;正在颠覆传统基础设施芯片。 我们看到云和超大规模服务运营商正在推动更高的计算密度。随着 128 核心 CPU 设计上市&#xff08;Microsoft Cobalt、阿里巴巴 Y…

搭建Zabbix监控系统

概述 Zabbix是一个基于Web界面的企业级开源监控套件&#xff0c;提供分布式系统监控与网络监视功能。具 备主机的性能监控&#xff0c;网络设备性能监控&#xff0c;数据库性能监控&#xff0c;多种告警方式&#xff0c;详细报表、图表的绘制等 功能。监测的对象可以是Linux或 …

PB-03F 模组烧录流程

文章目录 前言一、准备1. 器材2. 软件&#xff08;1&#xff09;点击下面链接下载固件烧录工具&#xff08;2&#xff09;点击下面链接下载固件包&#xff08;3&#xff09;解压文件 二、烧录1. 打开PhyPlusKit...软件2. 选择串口及波特率并打开串口3. 选择文件并输入MAC地址4.…

【Flink网络数据传输(3)】RecordWriter的能力:实现数据分发策略或广播到下游InputChannel

文章目录 一.创建RecordWriter实例都做了啥1. 根据recordWrites数量创建不同的代理类2. 创建RecordWriters3. 单个RecordWriter的创建细节 二. RecordWriter包含的主要组件1. RecordWriter两种实现类分别实现分发策略和广播2. ChannelSelectorRecordWriter的发送策略2.1. Chann…