NOIP 2015模擬賽 nodgd題 題解 總結

2021-07-24 08:49:17 字數 3273 閱讀 1958

第一題一輩子過不了系列

這次考試又學到了許多新東西,受益匪淺

但是成績依舊不夠理想,第一題又炸了,明明好好的一道打表題都打錯了,身敗名裂

以後還是繼續鞏固一下這些零零散散的知識,否則考試犯了錯找不出來要浪費好多時間

好數【問題描述】

nodgd認為,如果乙個數的三進製表示裡數字1的個數和數字2的個數一樣多,那就是好數。現在nodgd想知道不小於n的最小的m個好數,你快告訴他。

【輸入格式】

輸入檔案a.in。

第一行包含有乙個整數t,表示nodgd提問的次數。

接下來t行,每行兩個十進位制表示的整數n,m,表示nodgd的一次提問。

【輸出格式】

輸出檔案a.out。

對每次提問輸出一行,包含m個由小到大排列的十進位制表示的整數,兩個數之間用空格隔開(注意,行末也應該有乙個空格,不然可能會出現一些莫名其妙的錯誤),表示nodgd的這次提問的答案。

【樣例輸入】

41 5

100 5

10000 5

1000000 5

【樣例輸出】

5 7 11 15 19

104 106 116 128 132

10016 10019 10023 10034 10035

1000003 1000009 1000011 1000026 1000031

【樣例解釋】

第一次提問中,5的三進製表示是12,7的三進製表示是21,11的三進製表示是102,15的三進製表示是120,19的三進製表示是201。

【資料範圍】

對於50%的資料,1≤n≤100,m≤10;

對於100%的資料,1≤n≤10^6,m≤100,t≤100

這題看起來很複雜,但是認真分析就會發現,n的範圍並不大,並且由於求的數字具有特殊性,所以打表是乙個很現實的做法,實際上打表是真的能過的,雖然時間效率相對較低但是比較平均,最後打出來的表也就10w左右

最後注意縮小一下常數,因為打表幾乎是卡著時間過的,常數大一點就爆了

#include#include#includeusing namespace std;

int t,n,m,s[155000],tot,f[20];

int main()

if(cnt1==cnt2)s[++tot]=i;

} cin>>t;

while(t--)

}

好文章【問題描述】

nodgd寫了一篇文章,自認為這是一篇好文章。nodgd的文章由n個小寫英文本母組成。文章的乙個子串指的是文章中的一段連續的字母,子串的長度就是這一段的字母個數。nodgd在文章中用了排比、對偶、前後照應之類的手法,所以就有很多個子串是相同或者相近的。為了向大家證明這是一篇好文章,nodgd決定給自己的文章進行評分。nodgd首先確定了乙個整數m,然後統計出文章中有多少個不相同的長度為m的子串,這個數量就是文章的評分。

然而,nodgd懶得老老實實計算這個評分了,就把任務丟給了你。

【輸入格式】

輸入檔案b.in。

第一行包含兩個整數n,m,表示文章的長度和需要統計的子串長度。

第二行包含乙個長度為n的只包含小寫字母的字串。

【輸出格式】

輸出檔案b.out。

輸出一行乙個整數,表示文章的評分。

【樣例輸入1】

5 3aaaab

【樣例輸出1】

2【樣例解釋1】

長度為3的子串有3個,分別是aaa,aaa,aab,其中不同的只有2個。

【樣例輸入2】

9 3abcabacba

【樣例輸出2】

7【樣例解釋2】

共有7個長度為3的子串,每個長度為3的子串都不同。

【資料範圍】

對於30%的資料,1≤m≤n≤200;

對於50%的資料,1≤m≤n≤2000;

對於另外20%的資料,1≤m≤50≤n≤200000;

對於100%的資料,1≤m≤n≤200000

這是一道非常有價值的題,不在於題目本身是多麼的難,多麼的經典,而是其中蘊含的演算法的優化和改進是平常做題中沒有涉及到的,但卻是非常重要的

首先可以想到用set,map加上substr來搞,能過50分

然後我們發現這些東西都是非常費時的,最費時的就是乙個乙個列舉子串

因此我們想到用字串hash,既能在o(n)時間內推算出每乙個子串的hash值,又能夠直接判斷答案

但是單純的字串hash只能過70分,原因很簡單,資料裡出現了卡hash的資料

我們知道,選擇hash的種子時一般都會選擇1e9+7這樣的質數,但是問題就在於其自然溢位

如果選擇了乙個種子為b,我們很容易知道字串的編號就在[0,b-1]區間中,但是出題人如果比較厲害並且很無聊,就會出資料卡這種種子,因為某些特殊的字串會使得每乙個子串不聚集的概率為%0.06左右

所以我們明白,選擇的種子過小了,實際上如果保證正確率在%99以上,需要選擇的種子必須大於1e15,但這顯然是不現實的

所以這裡我們可以選擇開兩個hash表,然後給同乙個字串附上兩個hash值,在判斷兩個字串是否相同時,必須兩個hash值都相同才行

最後再說幾句:

第二題是真的不錯,時隔多日仍然記得其機智的雙hash,這也是非常實用的做法,以後再也不怕hash被卡了!

然而第一題表打錯了簡直痛心疾首……身敗名裂啊!

繼續加油吧……

NOIP2015模擬11 5 旅行

經過觀察,可以發現題目有乙個比較不錯的性質 1 一條合法的路徑必須由兩條路徑組成,一條是奇數,另一條是偶數。所以我們可以先把每乙個點到達根節點的路徑求出來,深度為奇數的點放進乙個a aa陣列裡,偶數的放進b bb陣列裡,再給他們分別進行排序。然後進行兩兩結合,先把a陣列裡的所有數跟b1b b1 結合...

NOIP2015模擬11 3 裝飾大樓

給出乙個序列a,ai表示對於乙個h序列來講,以i結尾的lis的長度。h中的數兩兩不等。現在你知道了a刪去乙個數之後的序列b 未知刪掉哪位 求a序列有多少種。a 10 6 好多細節呀!不爽,懶得打題解。可以發現,對於乙個序列a,它滿足條件的前提就是,對於每乙個ai,都存在乙個aj j i 滿足aj 1...

NOIP2015模擬11 3 備用鑰匙

你知道just odd inventions社嗎?這個公司的業務是 只不過是奇妙的發明 just odd inventions 這裡簡稱為joi社。joi社有n名員工,編號從1到n。所有員工的工作時間從時刻0持續到時刻m,時刻0和時刻m的時候,所有員工都必須在公司內。某天,出於巧合,joi社的每個員...