标题:递增三元组

给定三个整数数组

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. 2018/03/14 每日一个Linux命令 之 ln

    ln 链接命令 -- 类似Windows的快捷方式,实际等于建立了一个文件同步的链接,我想,MAC上面复制一个文件到另一个路径,特别快,它可能就是建立了一个链接. -- 在通俗点讲,就是你创建链接之后 ...

  2. 正则表达式(三):Unicode诸问题下篇(转)

    原文:http://www.infoq.com/cn/news/2011/04/regular-expressions-4 我们使用正则表达式,熟练掌握各种功能和结构只是手段,解决实际的问题才是真正的 ...

  3. Why String is Immutable or Final in Java

    The string is Immutable in Java because String objects are cached in String pool. Since cached Strin ...

  4. RSA加密常用的填充方式 以及 常见错误

    一.RSA加密常用的填充方式 1.RSA_PKCS1_PADDING 输入:比 RSA modulus 短至少11个字节.如果输入的明文过长,必须切割,然后填充 输出:和modulus一样长 根据这个 ...

  5. phpsocketclient以及server样例

    一个菜鸟朋友,突然问了我这个问题...如今稍稍有点时间,就写了一个简单的样例给他,顺便贴上来 server端: <? php /** * @author 邹颢 zouhao619@gmail.c ...

  6. HTML5(字符标准,表单)

    字符标准 <meta charset="utf-8"> 表单 1.HTML 表单用于搜集不同类型的用户输入. 实例——创建文本字段 <form action=&q ...

  7. Django初级手册1-项目和应用的创建与简单的数据库操作

    创建项目 django-admin.py startproject mysite 1. 目录结构 mysite/ #项目的名称 manage.py #可通过命令和项目进行交互的文件 mysite/ # ...

  8. Mysql的group by语句

    如上图查询结果,因为group by后面的字段是的分组的依据字段,所以select子句中只有是group by后面的字段,或者是聚集函数才有意义.然而mysql居然可以在select子句中出现不在gr ...

  9. Codeforces Round #246 (Div. 2) D E

    这题说的是给了一个字符串当前缀和后缀相同的时候就计算此时的 整个串种拥有这样的子串友多少个,没想到用KMP解 用0开头的那种类型的 KMP 今天刚好也学了一下,因为KMP的作用是找出最长前缀 KMP ...

  10. Hive 体系结构介绍

    下面是Hive的架构图. 图1.1 Hive体系结构 Hive的体系结构可以分为以下几部分: (1)用户接口主要有三个:CLI,Client 和 WUI.其中最常用的是CLI,Cli启动的时候,会同时 ...