日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

2018年第九届蓝桥杯 - 省赛 - C/C++大学B组 - F.递增三元组

發(fā)布時間:2024/5/17 c/c++ 80 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2018年第九届蓝桥杯 - 省赛 - C/C++大学B组 - F.递增三元组 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

遞增三元組

給定三個整數(shù)數(shù)組
A = [A1, A2, … AN],
B = [B1, B2, … BN],
C = [C1, C2, … CN],
請你統(tǒng)計(jì)有多少個三元組(i, j, k) 滿足:

  • 1 <= i, j, k <= N
  • Ai < Bj < Ck
  • 【輸入格式】
    第一行包含一個整數(shù)N。
    第二行包含N個整數(shù)A1, A2, … AN。
    第三行包含N個整數(shù)B1, B2, … BN。
    第四行包含N個整數(shù)C1, C2, … CN。

    對于30%的數(shù)據(jù),1 <= N <= 100
    對于60%的數(shù)據(jù),1 <= N <= 1000
    對于100%的數(shù)據(jù),1 <= N <= 100000 0 <= Ai, Bi, Ci <= 100000

    【輸出格式】
    一個整數(shù)表示答案

    【樣例輸入】
    3
    1 1 1
    2 2 2
    3 3 3

    【樣例輸出】
    27

    資源約定:
    峰值內(nèi)存消耗(含虛擬機(jī)) < 256M
    CPU消耗 < 1000ms

    請嚴(yán)格按要求輸出,不要畫蛇添足地打印類似:“請您輸入…” 的多余內(nèi)容。

    注意:
    main函數(shù)需要返回0;
    只使用ANSI C/ANSI C++ 標(biāo)準(zhǔn);
    不要調(diào)用依賴于編譯環(huán)境或操作系統(tǒng)的特殊函數(shù)。
    所有依賴的函數(shù)必須明確地在源文件中 #include
    不能通過工程設(shè)置而省略常用頭文件。

    提交程序時,注意選擇所期望的語言類型和編譯器類型。

    Ideas

    首先我們要根據(jù)輸入數(shù)據(jù)的量級確定最終滿足要求的算法時間復(fù)雜度。

    如果是用三層暴力循環(huán)求遞增三元組,那么算法的時間復(fù)雜度就是O(N ^ 3),肯定不可能過所有的數(shù)據(jù)。

    對于100%的數(shù)據(jù),1 <= N <= 100000,所以最終滿足要求的算法時間復(fù)雜度應(yīng)該是O(n * logn)的。

    然后再來看題目要求,并沒有要求 i j k 的大小,所以我們可以先給三個數(shù)組進(jìn)行升序排序。

    然后對于B數(shù)組中的每一個數(shù)bi,我們可以在A數(shù)組中找到一個小于bi的最大數(shù)a,對應(yīng)的索引為a_idx,同樣可以在C數(shù)組中找到一個大于bi的最小數(shù)b,對應(yīng)的索引為b_idx。

    根據(jù)a_idx和b_idx,我們可以求出對應(yīng)A數(shù)組中小于bi的元素個數(shù) num_1,也可以求出C數(shù)組中大于bi的元素個數(shù) num_2,根據(jù)乘法原理,bi對應(yīng)的符合條件的遞增三元組個數(shù)為 num_1 * num_2。

    遍歷整個B數(shù)組,對于每個元素bi都在A、B數(shù)組中求出相應(yīng)的 num_1 * num_2,最后累加在一起就可以了。

    Code

    Python

    from bisect import bisect_left, bisect_rightif __name__ == '__main__':ans = 0n = int(input())A = sorted(list(map(int, input().split())))B = sorted(list(map(int, input().split())))C = sorted(list(map(int, input().split())))for item in B:num_1 = bisect_left(A, item)num_2 = n - bisect_right(C, item)print(num_1, num_2)ans += num_1 * num_2print(ans)

    總結(jié)

    以上是生活随笔為你收集整理的2018年第九届蓝桥杯 - 省赛 - C/C++大学B组 - F.递增三元组的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。