• USACO 2020 DEC Sleeping Cows P 题解


    将牛和牛圈按照升序排序。设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;
    }
    
  • 相关阅读:
    AC自动机模板
    2013 ACM/ICPC Asia Regional Changsha Online–C (模拟)
    Codeforces126B
    Codeforces182D
    Codeforces149E
    POJ3080
    POJ2752
    HDU4745
    HDU4737
    POJ1226
  • 原文地址:https://www.cnblogs.com/gary-2005/p/14186581.html
Copyright © 2020-2023  润新知