bzoj5157 樹狀陣列 上公升子串行

2021-08-19 06:29:41 字數 953 閱讀 1075

題面懶得扣了放個傳送門 題解

先離散化

設f[i]表示以i結尾的上公升子串行個數 那麼f

[i]=

sigm

a(f[

j])(

1<=

j<=i−1)f

[i]=

sigm

a(f[

j])(

1<=

j<=i−

1)

這個可以用樹狀陣列維護

考慮怎麼去重

對於乙個新加入的數i,用樹狀陣列可以求出他現在的答案ans

這個答案是包括了之前的f[i]的,所以統計答案的時候應該加ans-f[i],再把f[i]賦值為ans

由於題目要求上公升子串行長度不小於2,所以你乙個數i只應該為之後加1個貢獻,而不能加他總數個貢獻,因為要去重2333..

然後樹狀陣列change的時候爆int了wa了好久。。

#include

#include

#include

#include

#include

using

namespace

std;

const

int mod=1e9+7;

struct lsnodew[110000];

bool cmp(lsnode n1,lsnode n2)

void change(int x,int c)}

int findsum(int x)return ret;}

int main()

int ans=0;

memset(v,false,sizeof(v));

for(int i=1;i<=n;i++)

printf("%d\n",ans);

return

0;}

樹狀陣列求LIS(最長上公升子串行)

優點 同樣是o nlogn 的複雜度 二分做法只能計算出當前序列的lis 而樹狀陣列可以計算出以每乙個a i 為結尾的lis 且二分的做法只能計算出答案,無法得到具體方案。做法 樹狀陣列維護字首max 設以a i 結尾的lis為f i 樹狀陣列的c x 存放以x為結尾的lis,注意這裡的x是乙個具體...

樹狀陣列 不好做的最長上公升子串行

乙個數的序列bi,當b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串行 ai1,ai2,aik 這裡1 i1 i2 ik n。比如,對於序列 1,7,3,5,9,4,8 有它的一些上公升子串行,如 1,7 3,4,8 等等。這些子串...

bzoj1246(樹狀陣列)

樹狀陣列的靈活運用,維護的是最大值,因為整個陣列就是乙個字首最大值,所以可以用實現,求乙個字首最大值,和更新pos之後的最大值。很好的運用,多回顧思考 include include include include includeusing namespace std const int n 200...