1. 程式人生 > >藍橋杯:2018年第九屆藍橋杯省賽B組第六題—遞增三元組

藍橋杯:2018年第九屆藍橋杯省賽B組第六題—遞增三元組

給定三個整數陣列 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