做題記錄2022 4 29洛谷P1631序列合併

2022-10-10 10:21:13 字數 580 閱讀 5037

題目鏈結

可以很容易地想出暴力思路,但複雜度高達o(n2),所以必須優化

思路1:不難發現在a陣列到i,b陣列到j處,在它們前面的有i*j個,這i*j個數不可能比它大,所以只要在暴力列舉過程中判斷i*j<=n即可。

最後只要對和排序,求出前n個。注意存放和的陣列不能只有n個。

vectorsum;

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

}sort(sum.begin(),sum.end());

printf("%u

",sum[0

]);for(int i=1; i)

思路2:

暴力列舉的解法裡,除了全部n2個弄完再排序之外,還可以使用乙個優先佇列。

由於要求最小的n個,所以這個佇列的「容積」是n,一旦元素個數已達到n個,並且新的和小於隊頭,那麼就先出隊再將新的和入隊。

注意到:當a到i,b到j時,如果新的和大於隊頭,那麼後面再怎麼遍歷也不會小於隊頭了。所以可以這樣優化:

for(int i=0; i) 

else

}}

做題記錄22 3 31 洛谷P2250

由於csdn新增了字數限制,即日起本人開始轉戰 題目鏈結 這題我原本的想法是 按先x後y的公升序排序,隨後對於任意乙個i,查詢和i 1相交的部分,並在這部分從右往左種樹。最後進行檢查,把不滿足條件的地點種上樹即可。但這種方法好像難以實現,因為情況比較多,比如完全包含 部分相交 完全不相交等。其實可以...

洛谷狀壓DP做題記錄

題面確實是狀壓的入門題 用dp i j 表示以i結尾,狀態為j時的方案數,如下 includeusing namespace std const int maxn 1e6 7 const int n 20 int n,k ints maxn long long dp n maxn long long...

做題記錄 P6749 Yoshino

乙個長度為 n 的序列,第 i 項為 a i 對數列進行 m 次操作。l r x 把數列下標在 l,r 區間內的數賦值為了乙個從 x 開始公差為 1 的等差數列。查詢整個數列中的逆序對個數。n,m le 3 times 10 4 考慮逆序對本質。每次賦值等差序列是不會出現逆序對的。設當前修改的是 l...