51nod1376 最長遞增子串行的數量

2022-08-04 18:09:21 字數 1028 閱讀 8439

這道題很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...