
第九届蓝桥杯省赛C++B组 递增三元组 【 二分 】题解
发布日期:2021-05-07 08:50:10
浏览次数:24
分类:精选文章
本文共 1057 字,大约阅读时间需要 3 分钟。
目录
1.题目
给定三个整数数组
A=[A1,A2,…AN],
B=[B1,B2,…BN], C=[C1,C2,…CN],请你统计有多少个三元组 (i,j,k) 满足:
1≤i,j,k≤N
Ai<Bj<Ck 输入格式 第一行包含一个整数 N。第二行包含 N 个整数 A1,A2,…AN。
第三行包含 N 个整数 B1,B2,…BN。
第四行包含 N 个整数 C1,C2,…CN。
输出格式
一个整数表示答案。数据范围
1≤N≤105, 0≤Ai,Bi,Ci≤105 输入样例: 3 1 1 1 2 2 2 3 3 3 输出样例: 272.思路
思路:二分 先对三个数组进行sort排序,然后遍历b数组,对于b中的每一个数b[i],在a数组寻找最后一个小于b[i]的数的下标,这里我们记做l.再在c数组中寻找第一个大于b[i]的数的下标,这里我们记做r。a数组中,小于b[i]的数的个数为l+1,c数组中大于b[i]数的个数为n-r。因此当在三元递增组中,以b[i]为中间数的个数为(l+1)*(n-r)。遍历b数组,累加即为答案。
3.代码
#include#include using namespace std;typedef long long LL;const int N=1e5+10;int a[N],b[N],c[N];int main(){ int n; scanf("%d",&n); for(int i=0;i =b[i]) //如果未找到小于b[i]的数,将x标记为-1,后续计算时 x+1==0 { l=-1; } int x=l; l=0,r=n-1; while(l b[i]) r=mid; else l=mid+1; } if(c[l]<=b[i]) //如果未找到大于b[i]的数,将y标记为n,后续计算时 n-y==0; { r=n; } int y=r; res+=(LL)(x+1)*(n-y); } printf("%lld\n",res); return 0;}
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年04月29日 00时48分54秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
10-docker系列-docker文件共享和特权模式
2023-01-23
#C8# UVM中的factory机制 #S8.1.4# 约束的重载
2023-01-23
#C8# UVM中的factory机制 #S8.2.3# 重载sequence哪些情形
2023-01-24
#C8# UVM中的factory机制 #S8.4.1# factory机制的实现
2023-01-24
900行c语言贪吃蛇,原生js实现的贪吃蛇网页版游戏完整实例
2023-01-24
ado读取多条oracle数据,Oracle ADO数据存取
2023-01-24
aspen串联反应怎么输入_如何进步提升串联谐振试验装置的稳定性
2023-01-24
c++ string取子串_Integer与String的设计哲学
2023-01-24
c++ 数组批量赋值_数组之间不能赋值?穿个马甲吧!
2023-01-24
ctrl c 和 ctrl v 不能用了_神奇操作,原来CTRL键还能这么用
2023-01-24
cytoscape安装java_Cytoscape史上最全攻略
2023-01-24
c语言程序设计年历显示,C语言程序设计报告《万年历》.doc
2023-01-24
C语言程序设计梁海英答案,1.5 习题
2023-01-24
c语言编写单片机中断,C语言AVR单片机中断程序写法
2023-01-24
ddr2的上电顺序_S5PV210 DDR2初始化 28个步骤总结
2023-01-24
excel中最常用的30个函数_Excel玩转数据分析常用的43个函数!
2023-01-24