這是一道關於
題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...