dp 容斥 bzoj3622 已经没有什么好害怕的了

Posted foreverpiano

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dp 容斥 bzoj3622 已经没有什么好害怕的了相关的知识,希望对你有一定的参考价值。

https://www.lydsy.com/JudgeOnline/problem.php?id=3622

XJOI题 不过没做过。。

容斥计数啊

先排序

(f[i][j])为前(i)位有(j)位固定且(a[j] > b[k])的方案数

[f[i][j] = f[i - 1][j] + f[i - 1][j - 1] imes (last - (j - 1))]

(last)为最大的(k)使得(a[i] > b[k])

[f[n][i] = sum_{k=i}^{n}ans[k] inom{k}{i}]

这部分是容斥

然后(mathcal O(n ^ 2))暴力维护就好了

感觉好套路

#include <bits/stdc++.h>
#define int long long
#define rint register int
#define fo(i, n) for(rint i = 1; i <= (n); i ++)
#define out(x) cerr << #x << " = " << x << "
"
#define type(x) __typeof((x).begin())
#define foreach(it, x) for(type(x) it = (x).begin(); it != (x).end(); ++ it)
using namespace std;
// by piano
template<typename tp> inline void read(tp &x) {
  x = 0;char c = getchar(); bool f = 0;
  for(; c < '0' || c > '9'; f |= (c == '-'), c = getchar());
  for(; c >= '0' && c <= '9'; x = (x << 3) + (x << 1) + c - '0', c = getchar());
  if(f) x = -x;
}
const int mo = 1e9 + 9;
const int N = 2333;
int n, K;
int c[N][N], fac[N], f[N][N], ans[N], nxt[N], a[N], b[N];
main(void) {
  read(n); read(K);
  if((n - K) & 1) return puts("0"), 0;
  K = n - (n - K) / 2;
  for(int i = 0; i <= n; i ++)
    c[i][0] = 1;
  for(int i = 1; i <= n; i ++)
    for(int j = 1; j <= n; j ++)
      c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mo;
  fac[0] = 1;
  for(int i = 1; i <= n; i ++)
    fac[i] = fac[i - 1] * i % mo;
  for(int i = 1; i <= n; i ++) read(a[i]);
  for(int i = 1; i <= n; i ++) read(b[i]);
  sort(a + 1, a + n + 1); sort(b + 1, b + n + 1);
  for(int i = 1; i <= n; i ++) {
    for(int k = 1; k <= n; k ++)
      if(a[i] > b[k])
        nxt[i] = k;
  }
  f[0][0] = 1;
  for(int i = 1; i <= n; i ++) {
    for(int j = 0; j <= n; j ++) {
      f[i][j] = f[i - 1][j];
      if(j && nxt[i] - (j - 1) > 0) f[i][j] = (f[i][j] + f[i - 1][j - 1] * (nxt[i] - (j - 1)) % mo) % mo;
    }
  }
  for(int j = 0; j <= n; j ++)
    ans[j] = f[n][j] * fac[n - j] % mo;
   
  for(int j = n - 1; j >= 0; j --) {
    for(int i = j + 1; i <= n; i ++)
      ans[j] = (ans[j] - ans[i] * c[i][j] % mo + mo) % mo;
  }
  cout << ans[K] << "
";
}

以上是关于dp 容斥 bzoj3622 已经没有什么好害怕的了的主要内容,如果未能解决你的问题,请参考以下文章

[bzoj3622]已经没有什么好害怕的了——容斥or二项式反演+DP

bzoj 3622已经没有什么好害怕的了

[bzoj3622]已经没有什么好害怕的了_动态规划_容斥原理

[bzoj 3622]已经没有什么好害怕的了

bzoj 3622: 已经没有什么好害怕的了

BZOJ3622已经没有什么好害怕的了