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...