bzoj4361 isn dp 容斥 樹狀陣列

2022-05-08 17:36:14 字數 1236 閱讀 3888

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)\)

因為帶修改,所以樹狀陣列優化轉移

複雜度:\(o(n^2logn)\)

#include#define ll long long

#define rg register

using namespace std;

templateinline void read(t &x)

templateinline void write(t x)

if (x < 0) x = -x, putchar('-');

int len = -1, z[20]; while (x > 0) z[++len] = x%10, x /= 10;

for (rg int i = len; i >= 0; i--) putchar(z[i]+48);return ;

}const int n = 2010, mod = 1e9 + 7;

int n, a[n], b[n], f[n][n], m;

void pls(int &x, int y)

#define lowbit(x) (x & (-x))

void add(int id, int x, int k)

int sum(int id, int x)

int g[n], fac[n];

int main()

int ans = 0;

fac[0] = 1;

for (int i = 1; i <= n; i++) fac[i] = 1ll * fac[i - 1] * i % mod;

for (int i = 1; i <= n; i++) pls(ans, (1ll * fac[n - i] * g[i] % mod - 1ll * fac[n - i - 1] * g[i + 1] % mod * (i + 1) % mod + mod) % mod);

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

return 0;

}

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 容斥)

time limit 10 sec memory limit 256 mb submit 938 solved 485 submit status discuss 給出乙個長度為n的序列a a1,a2.an 如果序列a不是非降的,你必須從中刪去乙個數,這一操作,直到a非降為止。求有多少種不同的操作方...

bzoj 3622 容斥原理

題意 給出有n個元素的集合a和集合b,所有2n個元素互不相同,求將a集合中的元素和b集合中的元素兩兩配對,使a的元素大於b中元素的對數恰為n k2對。設f i j 表示a中的前i個元素配對後至少有j對滿足a的元素大於b中元素。那麼先將a和b排序,設ne x i 表示b中最後乙個小於a中i元素的位置。...