码迷,mamicode.com
首页 > 其他好文 > 详细

USACO 2020 DEC Sleeping Cows P 题解

时间:2020-12-30 11:00:01      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:clock   auth   bit   read   rest   iterator   getchar   line   its   

将牛和牛圈按照升序排序。设z[i]表示第i个牛圈可以和前z[i]头牛匹配。
从前往后扫描牛圈。dp[i][j][k]表示扫描到第i个牛圈,在前z[i]个牛中,还有j被钦定匹配和i+1~n的牛圈匹配。k表示是否有一个牛被钦定不被比配。
dp[i][j][k]可以扩展到dp[i+1][j+l][k‘] 考虑编号在(z[i-1],z[i]]里的牛,假设那个区间里的牛有l个被匹配。
然后再用dp[i+1][j+1][k]*(j+1)来更新dp[i+1][j][k],表示第i个牛圈和一个牛匹配。
如果有牛被钦定不被匹配,接下来的所有的牛圈都要匹配。

/*
{
######################
#       Author       #
#        Gary        #
#        2020        #
######################
*/
#include<bits/stdc++.h>
#define rb(a,b,c) for(int a=b;a<=c;++a)
#define rl(a,b,c) for(int a=b;a>=c;--a)
#define LL long long
#define IT iterator
#define PB push_back
#define II(a,b) make_pair(a,b)
#define FIR first
#define SEC second
#define FREO freopen("check.out","w",stdout)
#define rep(a,b) for(int a=0;a<b;++a)
#define SRAND mt19937 rng(chrono::steady_clock::now().time_since_epoch().count())
#define random(a) rng()%a
#define ALL(a) a.begin(),a.end()
#define POB pop_back
#define ff fflush(stdout)
#define fastio ios::sync_with_stdio(false)
#define check_min(a,b) a=min(a,b)
#define check_max(a,b) a=max(a,b)
using namespace std;
//inline int read(){
//    int x=0;
//    char ch=getchar();
//    while(ch<‘0‘||ch>‘9‘){
//        ch=getchar();
//    }
//    while(ch>=‘0‘&&ch<=‘9‘){
//        x=(x<<1)+(x<<3)+(ch^48);
//        ch=getchar();
//    }
//    return x;
//}
const int INF=0x3f3f3f3f;
typedef pair<int,int> mp;
/*}
*/
int n;
const int MAXN=3003;
const int MOD=1e9+7;
int s[MAXN],t[MAXN],z[MAXN],c[MAXN][MAXN],dp[MAXN][MAXN][2];
int main(){
	scanf("%d",&n);
	c[0][0]=1;
	rb(i,1,n)
		rb(j,0,n){
			c[i][j]=c[i-1][j];
			if(j) c[i][j]+=c[i-1][j-1],c[i][j]%=MOD;
		}
	rb(i,1,n){
		scanf("%d",&s[i]);
	}
	rb(i,1,n){
		scanf("%d",&t[i]);
	}
	sort(s+1,s+1+n);
	sort(t+1,t+1+n);
	rb(i,1,n){
		z[i]=z[i-1];
		while(z[i]!=n&&s[z[i]+1]<=t[i]){
			z[i]++;
		}
	}
	dp[0][0][0]=1;
	rb(i,0,n-1){
		rb(j,0,z[i]) 
			rep(flag,2){
				rb(k,0,z[i+1]-z[i]){
					(dp[i+1][j+k][flag|(k!=(z[i+1]-z[i]))]+=1ll*dp[i][j][flag]*c[z[i+1]-z[i]][k]%MOD)%=MOD;
				}
			}
		rb(j,0,z[i+1]-1){
			dp[i+1][j][0]+=1ll*dp[i+1][j+1][0]*(j+1)%MOD;
			dp[i+1][j][0]%=MOD;
			dp[i+1][j][1]=1ll*dp[i+1][j+1][1]*(j+1)%MOD;
		}
		dp[i+1][z[i+1]][1]=0;
	}
	int rest=0;
		rest+=dp[n][0][0];
		rest%=MOD;
		rest+=dp[n][0][1];
		rest%=MOD;
	cout<<rest<<endl;
	return 0;
}

USACO 2020 DEC Sleeping Cows P 题解

标签:clock   auth   bit   read   rest   iterator   getchar   line   its   

原文地址:https://www.cnblogs.com/gary-2005/p/14186581.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!