這道題很sb,但是絕大多數人是用了高階資料結構的,我這裡介紹一種(自己yy的)不需要高階資料結構的方法。
這道題不需要高階資料結構,考慮一開始的二分的方法,當我們們做到i時,我們維護的這個單調的序列的第j個位置表示的是
以min,a[x]為原序列,其中以x結尾的lis的長度為j.考慮在這個單調序列的每乙個位置上開乙個vector,表示出所有的x,容易發現,這個vector中x的a是單調不上公升的。我們還可以再開乙個vector記錄方案數的字首和,然後我們每次而二分到j這個位置時,再在j這個vector這裡二分即可,就能找到當前加入點的以他結尾的lis的方案數
#include
#include
#include
using
std :: vector;
const
int n = 5e4 + 9, p = 1e9 + 7;
int n, a[n], d[n], tot, p, w, si[n];
vector
g[n], f[n];
template
int lower_bound (t a, int l, int r, int x)
return l;
}bool cmp1 (int a, int b)
bool cmp2 (int a, int b)
void add (int x) else
// if (x == 1e9 + 1) printf ("%d\n", (w + p) % p);
f[p].push_back ((w + (f[p].empty () ? 0 : f[p].back ())) % p);
g[p].push_back (x);
++si[p];
}void io ()
int main ()
add (1e9 + 1);
printf ("%d\n", (f[tot].back () + p) % p);
return
0;}
51nod1376 最長遞增子串行的數量
51nod1376 最長遞增子串行的數量 好題。首先nlgn的方法求以每個位置的數為結尾的最長遞增子串行,記為dp i 顯然dp值為x的數的答案數是由dp值為x 1的數貢獻的。例如現在要求dp值為x的數i的答案數,從dp值為x 1的數中找乙個數j,當滿足j的座標小於i,且j的值小於i的值時j的答案數...
51nod 1134 最長遞增子串行
1134 最長遞增子串行 基準時間限制 1秒 空間限制 131072 kb 分值 0給出長度為n的陣列,找出這個陣列的最長遞增子串行。遞增子串行是指,子串行的元素是遞增的 例如 5 1 6 8 2 4 5 10,最長遞增子串行是1 2 4 5 10。input 第1行 1個數n,n為序列的長度 2 ...
51nod 1134 最長遞增子串行
1134 最長遞增子串行 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 給出長度為n的陣列,找出這個陣列的最長遞增子串行。遞增子串行是指,子串行的元素是遞增的 例如 5 1 6 8 2 4 5 10,最長遞增子串行是1 2 4 5 10。input 第1行 1個數n,n...