題面懶得扣了放個傳送門 題解
先離散化設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...