noip模擬賽 好元素 雜湊表的第一題

2022-06-04 07:39:09 字數 2014 閱讀 9952

這是一道關於

2

好元素

2s

【問題描述】

小a一直認為,如果在乙個由n

個整數組成的數列

中,存在以下情況:

am+an+ap = ai (1 <= m, n, p < i <= n , m,n,p

可以相同)

,那麼ai

就是乙個好元素。

現在小a

有乙個數列,請你計算數列中好元素的數目

【輸入格式】

第一行只有乙個正整數n

,意義如上。

第二行包含n

個整數,表示數列

【輸出格式】

輸出乙個整數,表示這個數列中好元素的個數。

【輸入樣例】

sample1

21 3

sample2

61 2 3 5 7 10

sample3

3-1 2 0

【輸出樣例】

sample1

1sample2

4sample3

1【資料範圍】

對於

10%的資料

1<=n<=10

對於40%

的資料1<=n<=500 -10^5<=ai<=10^5

對於70%

的資料1<=n<=5000 -10^6<=ai<=10^6

對於100%

的資料1<=n<=5000 -10^9<=ai<=10^9

分析:寫這道題會發現資料非常大,而我們如果用n2的方法就會出現很有趣的現象,比如。炸時間。所以我們得用雜湊表來解決這個問題。

接下來講解一下雜湊表是什麼,及一些神奇的東西:

雜湊表,又名雜湊表,將線性表(或者一群大資料)運用某種雜湊函式,將資料轉化成一種關鍵字。關鍵字組成另一種可以用於快速查詢的表。快速定位,快速查詢是否存在該元素。。很多資料可能有相同的關鍵字,所以可以將關鍵字相同的資料連成乙個新的線性表。

主要就是寫雜湊函式,而雜湊函式有很多種寫法。沒有固定的套路。有些可以講資料%乙個大質數,將整個線性表疊在乙個新的線性(但是有鍊錶)的表裡。可以用鄰接表來表現。這有點繞其實就是下圖的樣子。a代表將資料轉換成的關鍵字。後面連起來的東西就是關鍵字旗下的大資料。

當然有些也會用位運算,將後面幾位相同的數組成乙個線性序列。這道題其實就用這個方法。

。講一下這道題的大致做法:

從前往後列舉,每次列舉1,最後的重點,2,前面的乙個點,而我們雜湊表裡放的就是兩個數之和,而我們在列舉的時候。可以及時更新雜湊表。(在列舉完乙個新點,就將這個點與前面的每個點的值的和加入雜湊表)。其實就是列舉。但是這裡優化時間優化的嚇人。所以可以過//hhhhh。

放出**:

#include#includeusing namespace std;

#define m 4194303

int line[5001];

int n,cnt;

int hashline[m+1];

int vale[12600001];

int next[12600001];

void address(int w)

bool pure(int w)

return false;

}int ref()

{ int ans=0;

for(int i=1;i<=n;++i)

{for(int j=1;j就是這樣的東西。這個我認為比較好理解。還有就是。這個4194303數選的特別玄學。如果選小了。還過不了了?!!!!

noip模擬賽 第K小數

問題描述 有兩個正整數數列,元素個數分別為n和m。從兩個數列中分別任取乙個數 相乘,這樣一共可以得到n m個數,詢問這n m個數中第k小數是多少。輸入格式 輸入檔名為number.in。輸入檔案包含三行。第一行為三個正整數n,m和k。第二行為n個正整數,表示第乙個數列。第三行為m個正整數,表述第二個...

NOIP 模擬賽 鐘 模擬 鍊錶

biubiu 這道題實際上就是優化模擬,就是找到最先死的讓他死掉,運用時間上的加速,題解上說,要用堆優化,也就是這個意思。對於鍊錶,單項鍊表和迴圈鍊錶都不常用,最常用的是雙向鍊錶,刪除和插入比較方便。所謂掛鏈就是把鍊錶中的值域換成一坨別的東東西.include inline void read in...

noip模擬賽 第k大區間

問題描述 定義乙個長度為奇數的區間的值為其所包含的的元素的中位數。現給出n個數,求將所有長度為奇數的區間的值排序後,第k大的值為多少。輸入 輸入檔名為kth.in。第一行兩個數n和k 第二行,n個數。0 每個數 231 輸出 輸出檔名為kth.out。乙個數表示答案。輸入輸出樣例 kth.in kt...