P8667 [蓝桥杯 2018 省 B] 递增三元组

题目描述

给定三个整数数组 A=[A1​,A2​,⋯,AN​],B=[B1​,B2​,⋯,BN​],C=[C1​,C2​,⋯,CN​]。

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

  1. 1≤i,j,kN
  2. Ai​<Bj​<Ck

输入格式

第一行包含一个整数 N

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

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

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

输出格式

一个整数表示答案。

输入输出样例

输入 #1复制

3
1 1 1
2 2 2
3 3 3

输出 #1复制

27

说明/提示

对于 30% 的数据,1≤N≤100。

对于 60% 的数据,1≤N≤1000。

对于 100% 的数据,1≤N≤105,0≤Ai​,Bi​,Ci​≤105。

#include <bits/stdc++.h>
using namespace std;
const int N = 100010; 
int A[N],B[N],C[N];
int cntA[N],cntC[N]; 
int main() {
	int n;
	cin>>n;
	//遍历数组B 其实就是乘法计数原理 看这个位置A有多少个比他小 C有多少个比他大 然后依次相加 
	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);//排序 
	for(int i=1,j=1;i<=n;i++)
	{
		while(j<=n&&A[j]<B[i])
		{
			j++;
		}
		cntA[i]=j-1;//查找A的个数 注意要减一 
	}
	for(int i=1,j=1;i<=n;i++)
	{
		while(j<=n&&C[j]<=B[i])
		{
			j++;
		}
		cntC[i]=n-j+1;//查找C的个数 其实跟A差不多 最后把等于的也算上减去就可以了 
	}
	long long ans=0;
	for(int i=1;i<=n;i++)
	{
		ans+=cntA[i]*cntC[i];
	}
	cout<<ans<<endl;
    return 0;
}
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇