一次奇怪的ac經歷。。。上週被這道題卡了3天。。。
傳送門:
給出兩個長度為n的有序表a和b,在a和b中各任取乙個元素,可以得到n2個和,求這些和中最小的n個。(不要去重)
第一行包含乙個整數n(n<=400000); 第二行與第三行分別有n個整數,分別代表有序表a和b。整數之間由乙個空格隔開,大小在長整型範圍內,保證有序表的資料單調遞增。
輸出共n行,每行乙個整數,第i行為第i小的和。資料保證在長整型範圍內。
31 2 5
2 4 7
3
4先是在學校做了這道題,被歸到了「佇列」標籤裡,然後因為是求前n個最小值,那麼肯定就是用優先佇列啦。5
好的,看懂了上面我們進行下一步!把a和b陣列所有元素的和看作n個有序表(如下)
如果直接按照k路歸併的演算法,「把每個表的當前元素放入二叉堆中」需要log n的時間,刪除最小值,加入下乙個元素(所有表的)又需要log n的時間,總共就需要 n^2 log n 的時間,400000的資料規模鐵定爆了!!!
既然會爆,我們就來優化一下。先思考一下把乙個元素放入二叉堆的條件是什麼,是它在有序表中的前乙個元素被彈出(不是被放入)!所以我們從a1+b1開始掃,每次入堆的時候都打上標記,如果這個元素出堆了,那麼就把它所在的有序表的下乙個元素入堆!
綜上,o(n log n)!
**:
#include #include #include using namespace std;int n,a[400005],b[400005],t[400005];
struct sb
};priority_queueq;
inline void write(int x)//快速寫入
int main()
q.push(temp);
q.pop();
}}
有序表和並
問題 將兩個有序順序表合併成乙個有序順序表。演算法思想 不斷取兩個順序表表頭,比較大小,將小者存入新的有序順序表,直至其中乙個表比較完畢,將另乙個剩餘的表全部存入新的順序表。如果合併後仍讓原序排列 最好情況 其中乙個有序列表 的元素 一 一對應的小於 另乙個有序表的元素 比較次數 min m,n 次...
有序線性表的有序合併
對於這個問題其實想法很簡單,已經已知線性表是有序的,那麼我們只需要比較值的大小放入另外乙個陣列中或者直接輸出 要考慮的是兩個輸入序列的邊界問題。這個問題在 中注釋,也是常用的迴圈兩個線性表的方法。已知線性表 la 和 lb 中的資料元素按值非遞減有序排列,現要求將 la 和 lb 歸併為乙個新的線性...
鍊錶的有序
time limit 1000ms memory limit 65536kb submit statistic discuss problem description 集合有乙個重要的特性 互異性,即集合中任意兩個元素都是不同的,互異性使得集合中的元素沒有重複。給你 n 個包含重複數字的無序正整數序...