蓝桥杯:2018年第九届蓝桥杯省赛B组第六题—递增三元组

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/belous_zxy/article/details/84071951

给定三个整数数组
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

输入得到 a,b,c 每个数出现的个数,列出状态转移方程

i=100000 -> 1

a[i] = a[i]*b[i+1]+a[i+1]

b[i] = b[i]*c[i+1]+b[i+1]

c[i] = c[i]+c[i+1]

输出 a[1]

#include<stdio.h>
#include<stdlib.h>
//#define HOST
int main(int argc,char **argv)
{
	#ifdef HOST
		freopen("input.txt","r",stdin);
	#endif    
	int cnt,a[100005]={0},b[100005]={0},c[100005]={0};
	scanf("%d",&cnt);
	int temp;
	for(int i=1;i<=cnt;i++)
	{
		scanf("%d",&temp);
		a[temp]++;
	}
	for(int i=1;i<=cnt;i++)
	{
		scanf("%d",&temp);
		b[temp]++;
	}
	for(int i=1;i<=cnt;i++)
	{
		scanf("%d",&temp);
		c[temp]++;
	}
	for(int i=100000;i>=1;i--)
	{
		a[i]=b[i+1]*a[i]+a[i+1];
		b[i]=c[i+1]*b[i]+b[i+1];
		c[i]+=c[i+1];
	}
	printf("%d\n",a[1]);
    return EXIT_SUCCESS;
}

END

猜你喜欢

转载自blog.csdn.net/belous_zxy/article/details/84071951