bzoj4361 isn(樹狀陣列優化dp 容斥)

2022-04-30 08:30:10 字數 1116 閱讀 2627

time limit: 10 sec  memory limit: 256 mb

submit: 938  solved: 485

[submit][status][discuss]

給出乙個長度為n的序列a(a1,a2...an)。如果序列a不是非降的,你必須從中刪去乙個數,

這一操作,直到a非降為止。求有多少種不同的操作方案,答案模10^9+7。

第一行乙個整數n。

接下來一行n個整數,描述a。

一行乙個整數,描述答案。

41 7 5 3

181<=n<=2000

設$g(i)$為數列中長度為$i$的非降序列個數,那麼我們可以利用容斥原理求得答案

$ans=\sum_^g(i)*(n-i)!-g(i+1)*(n-i-1)!*(i+1)$

$g(i)$中的不合法情況(已經是非降序列卻又再刪數)一定是從$g(i+1)$轉移來的,所以可以利用$g(i+1)$去掉$g(i)*(n-i)!$中的不合法情況

$g(i)$怎麼求呢

設$f(i,j)$以$i$結尾,長度為$j$的非降序列的個數

$f(i,j)=\sum_^f(k,j-1)*[a_k<=a_i]$

但是這是$n^3$方的

於是我們用樹狀陣列把$k$優化成$(logn)$

複雜度為$o(n^2logn)$

$g(i)=\sum_^f(j,i)$

#include#include

#include

#include

using

namespace

std;

typedef

long

long

ll;#define n 2005

const ll p=1e9+7

;int

n,m,a[n],b[n],p[n];

ll fac[n],s[n][n],f[n][n],g[n],ans;

inline ll md(ll a)

void add(int id,int x,ll v)

ll sum(

int id,int x)

void

prep()

intmain()

BZOJ4361 isn(動態規劃,容斥)

bzoj 首先我們如果確定了乙個不降序列,假設它的長度為 i i 那麼可行的方案數為i n i role presentation i n i i n i 但是這樣有一些非法的情況,即刪掉最後乙個數之前已經是有序的了。那麼設g i g i 表示長度為 i i 的不降序列的總數 因為所有長度為 i r...

bzoj4361 isn dp 容斥 樹狀陣列

darkbzoj g i 表示長度為 i 的非降序列的個數 那麼,ans sum g i n i g i 1 n i 1 i 1 怎麼求 g i 呢 設 f i j 為長度為 i 的非降序列,以最後乙個數是 j 的數量 f i j sum f i 1 k k j 這樣是 o n 3 因為帶修改,所以...

bzoj1246(樹狀陣列)

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