标题:递增三元组

给定三个整数数组

A = [A1, A2, ... AN],

B = [B1, B2, ... BN],

C = [C1, C2, ... CN],

请你统计有多少个三元组(i, j, k) 满足:

  1. 1 <= i, j, k <= N
  2. Ai < Bj < Ck

【输入格式】

第一行包含一个整数N。

第二行包含N个整数A1, A2, ... AN。

第三行包含N个整数B1, B2, ... BN。

第四行包含N个整数C1, C2, ... CN。

对于30%的数据,1 <= N <= 100

对于60%的数据,1 <= N <= 1000

对于100%的数据,1 <= N <= 100000 0 <= Ai, Bi, Ci <= 100000

【输出格式】

一个整数表示答案

【样例输入】

3

1 1 1

2 2 2

3 3 3

【样例输出】

27

资源约定:

峰值内存消耗(含虚拟机) < 256M

CPU消耗 < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

注意:

main函数需要返回0;

只使用ANSI C/ANSI C++ 标准;

不要调用依赖于编译环境或操作系统的特殊函数。

所有依赖的函数必须明确地在源文件中 #include

不能通过工程设置而省略常用头文件。

提交程序时,注意选择所期望的语言类型和编译器类型。

思路:

递增三元组,用三个数组表示;先排序sort,找到a数组中 第一个大于等于b[i]的数下标为j,找到c数组中 第一个比b[i]大的数下标为k,推导公式计算出结果。

AC代码:

#include<iostream>
#include<algorithm>
using namespace std; //4
//1 3 4 5
//1 2 2 2
//2 3 3 4 int a[100010];
int b[100010];
int c[100010];
int n;
long long ans = 0; int main(){
//输入数据
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
cin>>b[i];
}
for(int i=1;i<=n;i++){
cin>>c[i];
}
//排序
sort(a+1,a+n+1);
sort(b+1,b+n+1);
sort(c+1,c+n+1); //定义两个指针(下标)
int j = 1;
int k = 1;
//以b为中间值 在a数组 c数组中查找
for(int i=1;i<=n;i++){
while(j<=n && a[j] < b[i]) j++; //在a数组中查找第一个大于等于b[i]的数
while(k<=n && c[k] <= b[i]) k++; //在c数组中查找第一个大于b[i]的数
ans += (long long)(j-1) * (n-k+1); //计算公式 可以自己举例推导出来
}
cout<<ans<<endl;
}

upper_bound 和 lower_bound也可以解决问题:

代码

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
int a[maxn],b[maxn],c[maxn]; int main(){
int n;
cin>>n;
for(int i=0; i<n; i++ ){
cin>>a[i];
}
for(int i=0; i<n; i++ ){
cin>>b[i];
}
for(int i=0; i<n; i++ ){
cin>>c[i];
}
sort(a,a+n);
sort(b,b+n);
sort(c,c+n); ll cnt=0;
//以b为中间值
for(int i=0; i<n; i++ ){
ll pos1 = lower_bound(a,a+n,b[i])-a; //在a数组中查找比b大于等于的第一个数的指针
ll pos2 = upper_bound(c,c+n,b[i])-c; //在c数组中查找比b大的最第一个数的指针
cnt += (ll)pos1*(n-pos2);
}
cout<<cnt<<endl;
return 0;
}

下面是错误代码,不能以a为基准 在b、c中查找。会出现b和c中元素重复情况。解决方法是 以b数组为基准 在a、c数组中查找

代码:

#include<iostream>
#include<algorithm>
using namespace std; //4
//1 3 4 5
//1 2 2 2
//2 3 3 4 int a[100010];
int b[100010];
int c[100010];
int n;
long long ans = 0; int main(){
//输入数据
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
cin>>b[i];
}
for(int i=1;i<=n;i++){
cin>>c[i];
}
//排序
sort(a+1,a+n+1);
sort(b+1,b+n+1);
sort(c+1,c+n+1); //定义两个指针(下标)
int j = 1;
int k = 1;
for(int i=1;i<=n;i++){
//找到b数组中 第一个比a[i]大的数
while(j<=n && b[j]<a[i]){
j++;
}
// cout<<"j="<<j;
//找到c数组中 第一个比a[i]大的数
while(k<=n && c[k]<a[i]){
k++;
}
// cout<<" k="<<k<<endl;
if(j<=n && k<=n){
ans += (n-j+1) * (n-k+1);//计算公式:b中j后面的数都比a[i]大 k同理 组数=jk相乘
}
}
cout<<ans<<endl;
}

解法二:

递增三元组|2018年蓝桥杯B组题解析第六题-fishers的更多相关文章

  1. 2018年蓝桥杯A组C/C++决赛题解

    2018年第九届蓝桥杯A组C/C++决赛题解 点击查看视频题解 点击查看2018年蓝桥杯A组C/C++决赛题目(不含答案) 1:三角形面积 画个图,求三角形面积,可以用外接长方形 - 其他多余区域面积 ...

  2. 2018年蓝桥杯A组C/C++决赛题目

    2018年蓝桥杯A组C/C++决赛题目 2018年蓝桥杯A组C/C++决赛题解     1:三角形面积 已知三角形三个顶点在直角坐标系下的坐标分别为: (2.3, 2.5) (6.4, 3.1) (5 ...

  3. 2018年蓝桥杯B组C/C++决赛题解

    2018年第九届蓝桥杯B组C/C++决赛题解 点击查看2018年蓝桥杯B组C/C++决赛题目(不含答案) 1.换零钞 ok 枚举 设x表示1元钱的个数,y表示2元钱的个数,z表示5元钱的个数 x+21 ...

  4. 2018年蓝桥杯B组C/C++决赛题目

    自己的博客排版,自我感觉略好一点. 先放上题目. 点击查看2018年蓝桥杯B组C/C++决赛题目题解     1.换零钞 x星球的钞票的面额只有:100元,5元,2元,1元,共4种. 小明去x星旅游, ...

  5. 乘积最大|2018年蓝桥杯B组题解析第十题-fishers

    标题:乘积最大 给定N个整数A1, A2, ... AN.请你从中选出K个数,使其乘积最大. 请你求出最大的乘积,由于乘积可能超出整型范围,你只需输出乘积除以1000000009的余数. 注意,如果X ...

  6. 奇怪的分式|2014年蓝桥杯B组题解析第六题-fishers

    奇怪的分式 上小学的时候,小明经常自己发明新算法.一次,老师出的题目是: 1/4 乘以 8/5 小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 (参见图1.png) 老师刚想批评他,转念 ...

  7. 第六届蓝桥杯JavaB组国(决)赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.分机号 X老板脾气古怪,他们公司的电话分机号都是3位数,老板规定,所有号码必须是降序排列,且不能有重复的数位.比如: 751,520, ...

  8. 第六届蓝桥杯JavaA组国(决)赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.胡同门牌号 小明家住在一条胡同里.胡同里的门牌号都是连续的正整数,由于历史原因,最小的号码并不是从1开始排的. 有一天小明突然发现了有 ...

  9. 买不到的数目|2018年蓝桥杯A组题解析第八题-fishers

    买不到的数目 小明开了一家糖果店.他别出心裁:把水果糖包成4颗一包和7颗一包的两种.糖果不能拆包卖. 小朋友来买糖的时候,他就用这两种包装来组合.当然有些糖果数目是无法组合出来的,比如要买 10 颗糖 ...

随机推荐

  1. es新增字段,并设置默认值

    重新设置mapping 添加新的字段. 设置es允许脚本执行:elasticsearch.yml script.inline: true 然后执行脚本 POST linewell_assets_mgt ...

  2. c/c++ 中的char* ,const char* 和 char* const 总结[转]

    文章转自:c/c++ 中的char* ,const char* 和 char* const 总结 例1: char* str="abc";//错误写法 (在.c文件中是正确的) c ...

  3. Spark Core(三)Executor上是如何launch task(转载)

    1. 启动任务 在前面一篇博客中(Driver 启动.分配.调度Task)介绍了Driver是如何调动.启动任务的,Driver向Executor发送了LaunchTask的消息,Executor接收 ...

  4. jquery.dataTables表格中的内容怎么设置让它不自动换行

    在table中增加 style="white-space: nowrap;" ,这样会撑大td.会出现滚动条. 其他内容配置:每列宽度: "aoColumnDefs&qu ...

  5. context、config

    Tomcat启动时已经创建了context,并使用它读取了web.xml中的参数,后台可以从context里获取参数 后台获取参数代码: ServletContext context = getSer ...

  6. AngularJS 表达式 对象和数组

    AngularJS 使用 表达式 把数据绑定到 HTML. AngularJS 表达式 AngularJS 表达式写在双大括号内:{{ expression }}. AngularJS 表达式把数据绑 ...

  7. SQL CASE 多条件用法

    Case具有两种格式.简单Case函数和Case搜索函数. --简单Case函数 CASE sex          WHEN '1' THEN '男'          WHEN '2' THEN ...

  8. Java jdbc 操作数据库详解

    原文地址https://www.cnblogs.com/huguodong/p/5910859.html JDBC(Java Data Base Connectivity,java数据库连接)是一种用 ...

  9. matlab中的containers.Map()

    matlab中的containers.Map() 标签: matlabcontainers.Map容器map 2015-10-27 12:45 1517人阅读 评论(1) 收藏 举报  分类: Mat ...

  10. 7zip

    1.下载地址. https://www.7-zip.org/ 2.傻瓜式安装.