題目給出兩個序列,兩個序列間有邊相連,我們要選出不交叉的邊,使得所選的邊最多
我們發現,如果我們對其中乙個序列從小到大排序的話,這個問題就變成了求另乙個序列的最長上公升子串行的問題。
由於這個題目的資料比較大,一般的求最長上公升子串行的方法是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...