bzoj3139 [hnoi2013]比赛

bzoj3139 [hnoi2013]比赛


原题链接


玄学DFS???

首先,傻逼DFS,水出50分
暴力出奇迹

// It is made by XZZ
#include<cstdio>
#include<algorithm>
using namespace std;
#define rep(a,b,c) for(rg int a=b;a<=c;a++)
#define drep(a,b,c) for(rg int a=b;a>=c;a--)
#define erep(a,b) for(rg int a=fir[b];a;a=nxt[a])
#define il inline
#define rg register
#define vd void
typedef long long ll;
il int gi(){
    rg int x=0;rg char ch=getchar();
    while(ch<'0'||ch>'9')ch=getchar();
    while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    return x;
}
int n,a[12],cnt;
int sum,tot,x[46],y[46];
il vd dfs(int now,int _sum){//第now场比赛
    if(now==cnt+1){if(sum==_sum)tot=tot==1000000006?0:tot+1;return;}
    if((cnt-now+1)*3+_sum<sum)return;
    //x胜
    if(a[x[now]]>2)a[x[now]]-=3,dfs(now+1,_sum+3),a[x[now]]+=3;
    //y胜
    if(a[y[now]]>2)a[y[now]]-=3,dfs(now+1,_sum+3),a[y[now]]+=3;
    //平手
    if(a[x[now]]&&a[y[now]])--a[x[now]],--a[y[now]],dfs(now+1,_sum+2),++a[x[now]],++a[y[now]];
}
int main(){
    n=gi();
    rep(i,1,n)a[i]=gi(),sum+=a[i];
    sort(a+1,a+1+n);
    rep(i,1,n)rep(j,i+1,n)x[++cnt]=i,y[cnt]=j;
    dfs(1,0);
    printf("%d
",tot);
    return 0;
}

正解参见ljh_2000大佬的blog。。。
很久以前写的现在给忘了

// It is made by XZZ
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
#define rep(a,b,c) for(rg int a=b;a<=c;a++)
#define drep(a,b,c) for(rg int a=b;a>=c;a--)
#define erep(a,b) for(rg int a=fir[b];a;a=nxt[a])
#define il inline
#define rg register
#define vd void
#define mod 1000000007
typedef long long ll;
il int gi(){
    rg int x=0;rg char ch=getchar();
    while(ch<'0'||ch>'9')ch=getchar();
    while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    return x;
}
int n,A[12],cnt;
int x[46],y[46];
ll base[12];
map<ll,ll>Map[11];
map<ll,ll>::iterator it;
il int dfs(int l,int r,int*lst){//第now场比赛
    if(l>=r){
    if(lst[l])return 0;
    if(l==n)return 1;
    int a[11];
    rep(i,1,n)a[i]=lst[i];
    sort(a+1,a+n+1);
    ll Hash=0;
    rep(i,1,n)Hash+=base[i]*a[i];
    it=Map[l+1].find(Hash);
    if(it!=Map[l+1].end())return it->second;
    int ret=dfs(l+1,n,a);
    Map[l+1][Hash]=ret;
    return ret;
    }
    int tot=0;
    if(lst[l]>2)lst[l]-=3,tot+=dfs(l,r-1,lst),tot%=mod,lst[l]+=3;
    if(lst[r]>2)lst[r]-=3,tot+=dfs(l,r-1,lst),tot%=mod,lst[r]+=3;
    if(lst[l]&&lst[r])--lst[l],--lst[r],tot+=dfs(l,r-1,lst),tot%=mod,++lst[l],++lst[r];
    return tot;
}
int main(){
    n=gi();
    rep(i,1,n)A[i]=gi();
    sort(A+1,A+n+1);
    base[0]=1;
    rep(i,1,n)base[i]=base[i-1]*29;
    printf("%d
",dfs(1,n,A));
    return 0;
}

原文地址:https://www.cnblogs.com/xzz_233/p/7590838.html