hdu 1025 二分法求LIS

2021-07-04 02:01:26 字數 767 閱讀 7368

題目給出兩個序列,兩個序列間有邊相連,我們要選出不交叉的邊,使得所選的邊最多

我們發現,如果我們對其中乙個序列從小到大排序的話,這個問題就變成了求另乙個序列的最長上公升子串行的問題。

由於這個題目的資料比較大,一般的求最長上公升子串行的方法是n方的,顯然不能滿足題目的要求,我們建立乙個陣列g,g[i]表示長度為i的上公升子串行最後乙個數的最小值,那麼顯然g陣列是嚴格單調的,確切的說是嚴格單調上公升的,那麼,我們想到利用二分的方法對lis進行優化,對於乙個數x,找到陣列g中第乙個大於x的數的位置,如果找不到,就將序列的長度增加1,g[len]=x,否則,由於x小於目前找到的這個位置上的數,我們用x更新g陣列,即g[第乙個大於x的位置]=x

這樣我們就得到了乙個新的求lis的演算法,並且這個演算法的時間複雜度是o(nlogn),這樣的話就可以很好的解決這個問題了。

另外,這個題還有乙個陷阱:就是當找到的序列長度如果大於1輸出的是roads否則是road,我就因為沒有注意到這個wa了好幾次tat

#include #include #include #include using namespace std;

struct node

a[500005];

int n,k,q=0;

int g[500005];

void lis(int x)

if ((l==k-1)&&(g[k-1]x) g[l]=x;

}bool cmp(node a,node b)

return 0;

}

C 二分法查詢,遞迴二分法

用二分法來求需要查詢的值.includeusing namespace std 查詢key元素是否存在 int findkey const int buf 100 const int ilen,const int key else right left mid 1 查詢失敗 return 1 查詢k...

python二分法查詢 Python 二分法查詢

二分法查詢主要的作用就是查詢元素 lst 1,3,5,7,12,36,68,79 資料集 百萬級資料 num int input 請輸入你要查詢的元素資訊 for el in lst if num el print 存在 break else print 不存在 len lst 0 1 2 3 4 ...

解方程 二分法 HDU

problem description 給定方程 8x4 7x3 2x2 3x 6 y,請計算x在 0,100 範圍內的解。input 輸入資料首先是乙個正整數t 1 t 100 表示有t組測試資料。接下來t行,每行包含乙個實數y fabs y 1e10 output 請計算並輸出方程在範圍 0,1...