題目鏈結
vis 陣列統計每個數被訪問的次數,如果乙個數被訪問了 k 次,則該數的後 k 個數一定都存在,則直接跳轉到 k 後面繼續判斷。
還有需要注意的是:在輸入輸出資料很大的時候,建議使用 scanf 和 printf 取代 cin 和 cout,不然可能會超時。這道題就是。
#include
using namespace std;
const
int maxnum =
1000005
;int vis[maxnum]
;int
main()
vis[num]=1
;printf
("%d "
, num);}
return0;
}
對於同樣的思路,如果使用 map 則會超時,因為使用 或 find 成員函式訪問時都是要遍歷查詢的,沒有普通陣列那麼快。
#include
#include
using namespace std;
intmain()
nums[num]=1
;printf
("%d "
, num);}
return0;
}
思路:對於所有的數,起初他們的根節點都指向自己,表示沒出現過。當遇到乙個數時,找到他的根節點,由於根節點始終是未出現過的,所以輸出根節點,接著把根節點再指向乙個新的根節點(比舊的根節點大 1),這樣就能始終保持根節點是未出現過的了。
在查詢根節點的同時使用路徑壓縮,可以更快的查詢到根節點。
6
1 2 3 4 1 3
遇到 1,1 的根節點是 1,輸出 1,指向新的根節點 2,也就是 par[1] = 1 + 1;
遇到 2,2 的根節點是 2,輸出 2,指向新的根節點 3
遇到 3,3 的根節點是 3,輸出 3,指向新的根節點 4
遇到 4,4 的根節點是 4,輸出 4,指向新的根節點 5
遇到 1,1 的根節點是 5,輸出 5,指向新的根節點 6
遇到 3,3 的根節點是 6,輸出 6,指向新的根節點 7
#include
using namespace std;
const
int maxnum =
1000005
;int par[maxnum]
;void
init()
intfind
(int x)
intmain()
return0;
}
普通陣列:228ms
並查集:39ms
[藍橋杯][2019 年第十屆真題]修改陣列-題解(c++**)-dotcpp 程式設計社群
[藍橋杯][2019 年第十屆真題]修改陣列-題解(c++**)(鍊錶式並查集 + 這是什麼神仙演算法)-dotcpp 程式設計社群
藍橋杯 2023年第十屆真題 修改陣列
藍橋杯 2019年第十屆真題 修改陣列 時間限制 1sec 記憶體限制 128mb 提交 234 解決 36 題目描述 給定乙個長度為 n 的陣列 a a1,a2,an 陣列中有可能有重複出現 的整數。現在小明要按以下方法將其修改為沒有重複整數的陣列。小明會依次修改 a2,a3,an。當修改 ai ...
第十屆藍橋杯省賽A組(C C 組)修改陣列
每輸入乙個數就用visit陣列記錄這個數已經輸入過了的記錄,這樣輸入下乙個數的時候,判斷一下是否是前面有的數。這是保留流做法,耗記憶體。include includeusing namespace std bool visit 10000 用陣列記錄乙個數是否被使用過 int main visit ...
2019第十屆藍橋盃國賽c B組真題
正確答案還沒出來,有寫 的部分僅屬於自己的見解。持續更新中.請找到兩個正整數x和y滿足下列條件 1 2019思路 直接暴力,sqrt函式會丟失精度,把找到的值再平方一下看看是否構成等差數列,找到的第一對 x,y值為即為答案。include includeusing namespace std int...