在很多情況下,問題的範圍雖然定義在整數集合zz,但是只涉及其中mm個有限數值,並且與數值的絕對大小無關(只把這些數值作為代表,或只與它們的相對順序有關)。此時,我們就可以把整數集合zz中的這mm個整數與1~m1~m建立對映關係。
通俗來講,就是把無限空間中有限的個體對映到有限的空間中去,以此提高演算法的時空效率。
演算法流程
預處理先將無序陣列排序。
去重。二分查詢
知識拓展
c++stl中的unique函式解析
c++ lower_bound 與 upper_bound 函式
模板
//離散化預處理
inline voiddiscrete()}//
二分查詢 x對映為那個1~m之間的整數
inline int query(int
x)
例題鏈結
離散化+排序
這道題目是一道離散化的好題,因為我們這裡的語言,是非常的分散,所以我們可以把他們匯聚在一起,也就是重新定義這些語言,重新標號1,2,3,…,n1,2,3,…,n。
這道題目統計方面,因為時間限制非常嚴格,所以動用了c++11的雜湊級別map,和手動開o2的神仙操作嗎,具體看**吧。懶惰病發作
還要記得位運算|的運算級別是小於《的.
注:map內部是紅黑樹,unordered_map內部是雜湊,雜湊用來查詢比較方便,但是建立時間長
#include usingnamespace
std;
#pragma gcc optimize (2)
#pragma g++ optimize (2)
#define fir(i,a,b) for (int i=a;i<=b;i++)
#define pii pairconst
int n=200100
;int
n,m,sc[n],lan;
unordered_map
p,q;
pii mv[n],mv_ans[n];
intcmp(pii a,pii b)
intmain()
else
sc[i]=p[sc[i]];
q[sc[i]]++;
}cin>>m;
fir(i,
1,m)
fir(i,
1,m)
sort(mv+1,mv+1+m,cmp);
fir(i,
1,m)
if (mv_ans[i]==mv[1
])
return0;
}
柯里化再談
柯里化其實本身是固定乙個可以預期的引數,並返回乙個特定的函式,處理批特定的需求。這增加了函式的適用性,但同時也降低了函式的適用範圍。實現乙個函式,運算結果可以滿足如下預期結果 add 1 2 3 add 1,2,3 10 16 add 1 2 3 4 5 15剛好這個功能要實現的就是柯里化的思想。把...
離散化問題
題目傳送 uvalive 4127 the sky is the limit 大白書離散化簡單題。找了半天錯誤,居然是少輸出乙個空行。頓時感覺自己萌萌噠。其中計算幾何是套的之前留下的模板。ac include include include include include include inclu...
座標離散化
問題 在w h的格仔上畫了n條垂直或者水平的寬度為1的直線。求出這些直線將格仔劃分為了多少個區域?限制條件 1 w,h 1000000 1 n 500 輸入 首先輸入w,h,n 然後輸入對應的x1,x2,y1,y2.輸出區域的個數。輸入 10 10 5 x1 1 1 4 9 10 x2 6 10 4...