題目大意:給你三個有序陣列,長度分別為$n_a,n_b,n_c$且都不超過100000。陣列中的元素從0開始編號。
現在互動庫給你三個函式get_a(i),get_b(i),get_c(i),分別可以返回$a_i,b_i,c_i$。
現在要你編寫乙個函式query_kth(),告訴你$n_a,n_b,n_c,k$,讓你求三個陣列中第k大的元素。
解題思路:首先,我們假設元素互不相等。
設$l=\lfloor \frac\rfloor$,呼叫庫函式得出$a_l,b_l,c_l$的值。
假設$a_l$最小,則$a_0 ~ a_$都比它小。
考慮最壞情況,即$b_0 ~ b_$和$c_0 ~ c_$都比$a_l$小,此時有$3l-3$個數小於$a_l$,即$a_l$最大是第$3l-2$小的,不到k。
如果元素有相等,那麼$a_l$更不可能比第k小的要大。
所以我們把a的前l個元素去掉。
此時前k小的數中,也少了l,因此k減去l。
然後不斷重複這個過程,直到$k\leq 2$。
此時,第k小的元素必定在$a_0,a_1,b_0,b_1,c_0,c_1$當中,把它們查詢出來排序,當前第k個就是答案。
由於每次k都變為原來的$\frac$,總查詢次數應該是$3\log_ k+6$,極限時也只有99,uoj資料最大96(ex除外)。
如此即可得全部分數。
c++ code:
#include"kth.h"#include#includestd::vectorv;
int query_kth(int na,int nb,int nc,int k)else
k-=l;
} for(int i=1;i<=k;++i)
std::sort(v.begin(),v.end());
return v[k-1];
}
UOJ 192 UR 14 最強跳蚤
題目鏈結 暑期課第二天 樹上問題高階 具體內容看筆記部落格吧 題意n個節點的樹t 邊有邊權w 求滿足 u,v 上所有邊權乘積為完全平方數的路徑有多少條 看到 所有邊權乘積為完全平方數 想到完全平方數的特殊性 就是分解質因數後 質因數指數都為偶數 然後就想到分解邊權質因數 判質路徑邊權奇偶性 後者由於...
uoj 513 UR 19 清掃銀河
很簽到題 操作2先假設全部為黑,那麼變成了每選乙個點便會取反相連的邊 如果能暴力搞出所有環就可以高斯消元判斷,也許能過40 對原圖建dfs樹,發現只需要保留返祖邊加上對應路徑的環即可,任何的環都可以通過這些環異或得到,於是環的個數變為m級別,高斯消元o m 3 可以70 設返祖邊 u,v,w 的選擇...
UOJ 192 UR 14 最強跳蚤
這道題本來不想寫部落格的 但是鑑於自己犯了低階錯誤,還是寫篇部落格記載一下。一開始我的想法和題解裡面的演算法而比較類似,也是先分解質因數,然後用質因子是否出現偶數次來判斷當前這個數是否是完全平方數 然而這樣並不能ac,於是我去翻了題解 get 了乙個新做法,就是給每個出現過的質因子賦乙個 0,2 的...