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

2021-08-20 04:48:51 字數 948 閱讀 6034

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

好題。

首先nlgn的方法求以每個位置的數為結尾的最長遞增子串行,記為dp[i]

顯然dp值為x的數的答案數是由dp值為x-1的數貢獻的。

例如現在要求dp值為x的數i的答案數,從dp值為x-1的數中找乙個數j,當滿足j的座標小於i,且j的值小於i的值時j的答案數就可以加到i的答案裡,對i產生貢獻。由此轉化為偏序問題,用cdq分治求解(樹狀陣列也行)。

#include

#include

#include

std::vectors[50005];

struct nodep[50005],q[50005];

bool comp(node a,node b)

int n,f[50005],mx,ans[50005],a[50005];const int mo=1000000007;

int max(int a,int b)

void cdq(int l,int r)

else

while(j<=r)

while(i<=mid)p[++cnt]=q[i++];

for(int k=l;k<=r;k++)q[k]=p[k];

}int find(int l,int r,int

x) return ans;

}int main()

for(int i=0;ifor(int i=2;i<=t;i++)

;//修改

for(int j=0;jq[++cnt]=(node);//查詢

std::sort(q+1,q+1+cnt,comp);//按座標排

cdq(1,cnt);

}int sum=0;

for(int i=0;iprintf("%d\n",sum);

}

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

這道題很sb,但是絕大多數人是用了高階資料結構的,我這裡介紹一種 自己yy的 不需要高階資料結構的方法。這道題不需要高階資料結構,考慮一開始的二分的方法,當我們們做到i時,我們維護的這個單調的序列的第j個位置表示的是 以min,a x 為原序列,其中以x結尾的lis的長度為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...