題源:
問題能轉化成二分求最長上公升子串行
lower_bound()
返回第乙個大於等於查詢值的位置
lower_bound()
返回第乙個小於查詢值的位置
binary_search()
返回判斷查詢值在不在的 bool 值
#include #define numm ch - 48
#define pd putchar(' ')
#define pn putchar('\n')
#define pb push_back
#define fi first
#define se second
#define fre1 freopen("1.txt", "r", stdin)
#define fre2 freopen("2.txt", "w", stdout)
typedef long long int ll;
typedef long long int ll;
using namespace std;
templatevoid read(t &res)
templatevoid write(t x)
//static auto _ = () ();
//#pragma gcc optimize(3,"ofast","inline")
//const int maxn = 1e5 + 5;
int n;
int tmp, b[maxn], idx[maxn];
int main()
memset(b, 0x3f, sizeof(b));
for (int i = 1; i <= n; i++)
write(lower_bound(b + 1, b + n + 1, b[0]) - b - 1);
return 0;
}
模板 最長公共子串行
以洛谷p1439為例 n可以開到1e5 tle mle 編譯都過不了 讀入a陣列後雜湊一波,然後將b陣列的值在雜湊陣列裡找到對應值並替換,於是變成了求b陣列最長上公升子串行 玄學 可以使用二分,時間複雜度o nlogn ac include include include include using...
模板 最長公共子串行
洛谷p1436 模板 我們定義對映f ai i,那麼兩個排列可以轉換為 f a1 f a2 f an 1,2,n 和 f b1 f b2 f bn 我們進行這樣的轉換之後,就把本題轉換為求最長上公升子串行的長度的題目了。最長上公升子串行存在o n log n 時間複雜度的演算法,概述如下 考慮兩個數...
luogu 模板 最長公共子串行
給出1 n的兩個排列p1和p2,求它們的最長公共子串行。輸入格式 第一行是乙個數n,接下來兩行,每行為n個數,為自然數1 n的乙個排列。輸出格式 乙個數,即最長公共子串行的長度 普通求最長公共子串行的dp i j 的方法肯定不行 但這裡每個元素的值都是確定的了.以f i 表示i長度為i的最長公共子串...