1. 程式人生 > >bzoj1630/2023 [Usaco2007 Demo]Ant Counting

bzoj1630/2023 [Usaco2007 Demo]Ant Counting

gist count std sig cnblogs stat 螞蟻 php ant

傳送門:http://www.lydsy.com/JudgeOnline/problem.php?id=1630

http://www.lydsy.com/JudgeOnline/problem.php?id=2023

【題解】

直接dp,f[i,j]表示第i個種族選了j只螞蟻的方案數,轉移枚舉這個種族選擇的方案。

然後可以前綴和+滾動數組

技術分享
# include <stdio.h>
# include <string.h>
# include <iostream>
# include <algorithm>
// # include <bits/stdc++.h>
using namespace std; typedef long long ll; typedef long double ld; typedef unsigned long long ull; const int M = 5e5 + 10; const int mod = 1e6; # define RG register # define ST static int m, n, A, B; int a[M], bel[M], sum[M]; int f[2][100010], s[2][100010]; int main() { cin >> m >> n >> A >> B;
for (int i=1; i<=n; ++i) { scanf("%d", &bel[i]); a[bel[i]] ++; } int pre = 0, cur = 1; f[pre][0] = 1; for (int i=0; i<=n; ++i) s[pre][i] = 1; for (int i=1; i<=m; ++i) { for (int j=0; j<=n; ++j) { if(a[i] < j) f[cur][j] = (s[pre][j] - s[pre][j-a[i]-1
] + mod) % mod; else f[cur][j] = s[pre][j]; if(j == 0) s[cur][j] = f[cur][j]; else s[cur][j] = (s[cur][j-1] + f[cur][j]) % mod; } swap(pre, cur); } int ans = (s[pre][B] - s[pre][A-1] + mod) % mod; cout << ans << endl; return 0; }
View Code

bzoj1630/2023 [Usaco2007 Demo]Ant Counting