1236. 递增三元组

news2024/11/20 9:41:15

题目:

1236. 递增三元组 - AcWing题库

思路:枚举 

1.由给定数据估计时间复杂度。 

数据范围为1~1e5---->时间复杂度只能为O(n)或者O(nlogn)。 

2.先暴力枚举找到思路,再设法优化。 

只枚举中间的数组B。对于枚举的每一个bi,找出在A中比其小的a的数量cntA,在C中比其大的c的数量cntC。 cntA*cntC即为当b=bi时的所以满足条件的组合。

法一:二分

1.将A,B数组从小到大排序(sort)

2.明确目标:在A中寻找最后一个小于bi的a的下标,在C中寻找第一个大于bi的c的下标。将二者作为两次二分的分界点。

3.边界情况:当A中没有比bi小的数时,cntA=0;当C中没有比bi大的数时,cntC=0。

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
int a[N], b[N], c[N];
int n;
int main()
{
    cin >> n;
    int i;
    for (i = 0; i < n; i++)scanf("%d", &a[i]);
    for (i = 0; i < n; i++)scanf("%d", &b[i]);
    for (i = 0; i < n; i++)scanf("%d", &c[i]);
    //排序
    sort(a, a + n);
    sort(c, c + n);
    
    int cntA = 0, cntC = 0; ll cnt = 0;
    for (i = 0; i < n; i++) //遍历数组B
    {
    //确定最后一个小于bi的a的下标
        int L = 0, R = n - 1;
        while (L < R) {
            int mid = L + R +1>> 1;
            if (b[i] > a[mid])L = mid;
            else R = mid-1;
        }
        cntA=L+1;
        //边界情况:当A中没有比bi小的数时,cntA=0
        if(a[0]>=b[i])cntA=0;
        //cout<<cntA;

        //确定第一个大于bi的c的下标
        L = 0; R = n - 1;
        while (L < R) {
            int mid = L + R  >> 1;
            if (b[i] < c[mid])R = mid;
            else L = mid+1;
        }
        cntC=n-L;
        //边界情况:当C中没有比bi大的数时,cntC=0
        if(b[i]>=c[n-1])cntC=0;
        //cout<<cntC<<endl;

        cnt += (ll)cntA * cntC;
       
    }
    cout << cnt;
}

 法二:前缀和

1.前缀和本质:以空间换时间。

2.注意:s[i]前缀和求的是前数值从1~i的和,而非数组从a[0]~a[i](或者c[0]~c[i]的和)!!!

3.为确保数组下标>=0,将所以的数值+1(不影响大小比较,但却避免了递归求前缀和时s[i-1]下标为负)

代码:

#include<iostream>
#include<cstdio>
#include<cstring>//memset头文件
#include<algorithm>
using namespace std;
const int N = 1e5 + 10;
int a[N], b[N], c[N];
int Count[N];//表示每个数出现的次数(让数组A(C)的值等于cnt的下标-->字典)
int s[N];//求cnt[]的前缀和
int cntA[N], cntC[N];//分别表示A[],C[]中有多少个数小于b[i]

int main()
{
    int n;
    cin >> n;
    int i;
    for (i = 0; i < n; i++)scanf("%d", &a[i]), a[i]++;//统一加一不影响大小比较
    for (i = 0; i < n; i++)scanf("%d", &b[i]), b[i]++;//因为要以数值作为下标
    for (i = 0; i < n; i++)scanf("%d", &c[i]), c[i]++;//这样可以避免后面当i为1时s[i-1]的下标为负而报错
   
    //求cntA[]
    for (i = 0; i < n; i++)Count[a[i]]++;//此时i为下标,表示数值a[i]出现的次数
    for (i = 1; i < N; i++)s[i] = s[i - 1] + Count[i];//此时i为大小,表示(数值从1~i出现的次数)经过加一后数值最小为1而不是0
    for (i = 0; i < N; i++)cntA[i] = s[b[i] - 1];//此时i为下标,表示A中比数值b[i]小的数的个数

    //清空弹夹
    memset(Count, 0, sizeof(Count));
    memset(s, 0, sizeof(s));

    //求cntC[]
    for (i = 0; i < n; i++)Count[c[i]]++;
    for (i = 1; i < N; i++)s[i] = s[i - 1] + Count[i];
    for (i = 0; i < n; i++)cntC[i] = s[N-1] - s[b[i]];//此时i为下标,表示C中比数值b[i]大的数的个数
    
    //枚举每个b[i]
    long long res = 0;
    for (i = 0; i < n; i++)res += (long long)cntA[i] * cntC[i];
    cout << res;
    return 0;
}

教训:最后结果爆int了,要用long long!!!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java】智慧工地云平台源码支持多端展示(PC端、手机端、平板端)

智慧工地系统实现工地的数字化、精细化、智慧化生产和管理。 一、智慧工地发展趋势 1.更加智能 未来的智慧工地系统将逐步植入人工智能和虚拟现实等高科技技术以更为智慧的方式&#xff0c;来实现岗位人员与工地现场的交互与配合。智慧工地系统能够在工程全生命周期管理的过程…

内网如何使用Python第三方库包(举例JustinScorecardPy)

内网如何使用Python第三方库包 一、下载python whl文件(官网有的) 1、第一种方法 要直接下载whl文件&#xff0c;你可以按照以下步骤操作&#xff1a; 首先&#xff0c;访问 https://pypi.org/ 或 https://www.lfd.uci.edu/~gohlke/pythonlibs/ 网站。这两个都是Python的官方…

golang工程组件——redigo使用(redis协议,基本命令,管道,事务,发布订阅,stream)

redisgo redis 与 client 之间采用请求回应模式&#xff0c;一个请求包对应一个回应包&#xff1b;但是也有例外&#xff0c;pub/sub 模 式下&#xff0c;client 发送 subscribe 命令并收到回应包后&#xff0c;之后被动接收 redis 的发布包&#xff1b;所以若需要使 用 pub/s…

ROS 学习应用篇(三)话题Topic学习之自定义话题消息的类型的定义与调用

自定义消息类型的定义 Person.msg文件的定义&#xff08;数据接口文件的定义&#xff09; 创建msg文件 首先在功能包下新建msg文件夹&#xff0c;接着在该文件夹下创建文件。 定义msg文件内容 一个消息最重要的就是数据结构类型。这就需要引入一个msg文件&#xff0c;用于…

FM9918R系列-副边同步整流芯片

产品描述&#xff1a; FM9918R 系列是集成了 MOSFET 的同步整流二极管&#xff0c;用于替换反激式转换器的整流二极管&#xff0c;能够显著减少发热&#xff0c;提升系统的转换效率。IC 通过检测集成 MOSFET 的源漏电压来决定其开关状态。 FM9918R 系列能够兼容连续模式、非连续…

积分上限函数

定积分的形式 a&#xff1a;积分下限 b&#xff1a;积分上限 定积分的值与积分变量无关 积分上限函数的形式 x&#xff1a;自变量 t&#xff1a;积分变量 积分上限是变量&#xff0c;积分下限是常数 定积分的几何意义 x轴所围成面积 x轴以上面积为正 x轴以下面积为负 积分…

【华为数据通信】BFD是什么?

一、概述 BFD提供了一个通用的、标准化的、介质无关的、协议无关的快速故障检测机制&#xff0c;有以下两大优点&#xff1a; 对相邻转发引擎之间的通道提供轻负荷、快速故障检测。用单一的机制对任何介质、任何协议层进行实时检测。 BFD是一个简单的“Hello”协议。两个系统…

k8s系列-kuboard 该操作平台的使用操作

文章目录 一、相关平台&#xff0c;以及账号和密码镜像打包服务器仓库地址K8s平台数据库mysql 二、平台概述1.集群导入2.集群管理3.名称空间4.访问控制授权5.集群用户操作审计 三、kuboard平台操作手册一、部署服务操作1.名称空间部署2.工作负载部署 一、相关平台&#xff0c;以…

【中国知名企业高管团队】系列64:燕京啤酒

昨天&#xff0c;华研荟介绍了中国可能是最大的啤酒企业&#xff1a;青岛啤酒。接下来介绍总部位于北京的另一家啤酒企业——燕京啤酒。 当我想寻找官方的信息时发现坏了——燕京啤酒的官方PC网站竟然无法打开&#xff01;倒是设立了一系列的微信公众号&#xff0c;看第一个官…

cmake_install.cmake这个文件有什么用

2023年11月11日&#xff0c;周六上午 目录 简介 举例说明 简介 cmake_install.cmake是由 CMake 自动生成的一个脚本文件&#xff0c;用于在安装过程中执行各种安装操作。 请注意&#xff0c;cmake_install.cmake件是自动生成的&#xff0c;无需手动编辑或修改它。如果需要自…

postman 参数化使用csv导入外部数据

一、参数化脚本入参 postman中变量用{{变量名}}表示变量 二、创建外部数据文件 csv文件逗号分割多个变量和对应值注意编码格式必须为utf-8 三、run collection导入数据文件 四、设置运行参数run 浏览数据 可调试设置迭代次数&#xff1a;防止批量出错&#xff0c;可先设定…

响应式理工实验外语学校学院网站模板源码

模板信息&#xff1a; 模板编号&#xff1a;11862 模板编码&#xff1a;UTF8 模板颜色&#xff1a;蓝色 模板分类&#xff1a;学校、教育、培训、科研 适合行业&#xff1a;学校类企业 模板介绍&#xff1a; 本模板自带eyoucms内核&#xff0c;无需再下载eyou系统&#xff0c…

KCC@广州与 TiDB 社区联手—广州开源盛宴

10月21日&#xff0c;KCC广州与 TiDB 社区联手&#xff0c;在海珠区保利中悦广场 29 楼召开了一次难忘的开源盛宴。这不仅仅是 KCC广州的又一次线下见面&#xff0c;更代表着与 TiDB 社区及广州技术社区的首次深度合作。 活动的策划与组织由 KCC广州负责人 - 惠世冀、PingCAP 的…

spring boot configuration annotation processor notconfigured解决方法

spring boot configuration annotation processor notconfigured解决方法 一、问题描述二、解决方法 一、问题描述 我在使用ConfigurationProperties注解的时候idea出现提示信息spring boot configuration annotation processor notconfigured&#xff0c;但是却不影响程序的运…

Clickhouse学习笔记(4)—— Clickhouse SQL

insert insert操作和mysql一致 标准语法&#xff1a;insert into [table_name] values(…),(….)从表到表的插入&#xff1a;insert into [table_name] select a,b,c from [table_name_2] update 和 delete ClickHouse 提供了 Delete 和 Update 的能力&#xff0c;这类操作…

CodeWhisperer 史上最强大的 AI 编程助手!!

最近用了一个叫 CodeWhisperer 的插件&#xff0c;这个软件对于来说开发人员&#xff0c;插件有好多实用的功能&#xff0c;能有效减少我们的重复性工作&#xff0c;让编码更高效&#xff0c;代码质量也提升了很多。 CodeWhisperer 简介 CodeWhisperer 是亚⻢逊出品的一款基于…

GZ038 物联网应用开发赛题第3套

2023年全国职业院校技能大赛 高职组 物联网应用开发 任 务 书 &#xff08;第3套卷&#xff09; 工位号&#xff1a;______________ 第一部分 竞赛须知 一、竞赛要求 1、正确使用工具&#xff0c;操作安全规范&#xff1b; 2、竞赛过程中如有异议&#xff0c;可向现场考评…

C++---类的优化构造

首先&#xff0c;先介绍以下拷贝构造和构造的区别。 拷贝构造Date&#xff08;Date& d&#xff09;初始化&#xff1a;用一个实例对象去初始化一个未初始化的对象&#xff0c; 例&#xff1a;如果d1未被实例化&#xff0c;则Date d1 d2; 也会被编译器认为拷贝构造&#…

Springboot+vue的企业资产管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的企业资产管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的企业资产管理系统&#xff0c;采用M&#xff08;model&a…

Shopee店铺支付方式有哪些? Shopee自养号测评提高产品曝光率的有效方法

Shopee作为一家领先的电子商务平台&#xff0c;如何优化你的Shopee店铺商品再结合自养号测评&#xff0c;并提高曝光率和销售能力&#xff0c;其中支付是至关重要一环之一。 虾皮为卖家提供了多种收款方式&#xff0c;包括在线支付、虚拟账户余额和线下支付。市场适应性也是卖…