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\n",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\n",dfs(1,n,A));
return 0;
}
博主是蒟蒻,有问题请指出,谢谢!
本博客中博文均为原创,未经博主允许请勿随意转载,谢谢。
本博客中博文均为原创,未经博主允许请勿随意转载,谢谢。