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元素的位置。...