C 遞增三元組(列舉 字首和)

2021-10-09 21:00:24 字數 1591 閱讀 6318

給定三個整數陣列

a=[a1,a2,…an],

b=[b1,b2,…bn],

c=[c1,c2,…cn],請你統計有多少個三元組 (i,j,k)

滿足:1≤i,j,k≤n

ai本題的關鍵在於發現每個遞增三元組中a[i]和c[k]都要受b[j]約束,故應該通過列舉b[j]計算三元組的個數。同時本題的易錯點是統計各個值出現次數的時候,最後乙個元素的下標由資料最大值決定,統一用資料範圍最大值就好。

ac**:

#include

#include

const

int n=

100010

;typedef

long

long ll;

int n;

int a[n]

,b[n]

,c[n]

;int cnt[n]

,s[n]

;int anum[n]

,cnum[n]

;int

main()

for(

int i=

1;i<=n;

++i)

for(

int i=

1;i<=n;

++i)

//統計a陣列中各個值出現的次數

for(

int i=

1;i<=n;

++i)

++cnt[a[i]];

//計算a陣列中各個值出現次數的字首和

//因為值的範圍是1~100001,cnt的最後一項為cnt[100001]

for(

int i=

1;i++i) s[i]

=s[i-1]

+cnt[i]

;//anum[i]中儲存a中小於b[i]的數的個數

for(

int i=

1;i<=n;

++i) anum[i]

=s[b[i]-1

];memset

(cnt,0,

sizeof

(cnt));

memset

(s,0

,sizeof

(s))

;for

(int i=

1;i<=n;

++i)

++cnt[c[i]];

for(

int i=

1;i++i) s[i]

=s[i-1]

+cnt[i]

;//cnum[i]中儲存c中大於b[i]的數的個數

for(

int i=

1;i<=n;

++i) cnum[i]

=s[n-1]

-s[b[i]];

ll ans=0;

//統計答案

for(

int i=

1;i<=n;

++i) ans+

=(ll)anum[i]

*cnum[i]

;printf

("%lld"

,ans)

;return0;

}

遞增三元組

遞增三元組 描述給定三個整數陣列a a1,a2,an b b1,b2,bn c c1,c2,cn 請你統計有多少個三元組 i,j,k 滿足 1 i,j,k n ai bj ck 輸入第一行包含乙個整數n。第二行包含n個整數a1,a2,an。第三行包含n個整數b1,b2,bn。第四行包含n個整數c1,...

遞增三元組

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

遞增三元組

題目描述 給定三個整數陣列 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個整數c...