您的位置:首页 > 运维架构

[Meet In Middle] BZOJ 2679 [Usaco2012 Open]Balanced Cow Subsets

2016-07-10 18:40 573 查看
hash好慢啊 我打low了?

<span style="font-family:Microsoft YaHei;font-size:14px;color:#000066;">#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;

const int N=20;
const int M=1600005;

int cnt[1<<N],ans;

namespace hashmap{
const int P=1030407;
struct node{
int sta,sum; int next;
}G[M];
int head[P],inum;
inline void add(int sta,int sum){
int u=(sum%P+P)%P; G[++inum].sta=sta; G[inum].sum=sum; G[inum].next=head[u]; head[u]=inum;
}
inline void query(int sta,int sum){
int u=(-sum%P+P)%P;
for (int p=head[u];p;p=G[p].next)
if (G[p].sum==-sum)
cnt[sta|G[p].sta]++;
}
}

int n,mid,a[N+5];

inline void dfs1(int cur,int sum,int sta){
if (cur==mid+1){
hashmap::add(sta,sum);
return;
}
dfs1(cur+1,sum,sta);
dfs1(cur+1,sum+a[cur],sta|(1<<(cur-1)));
dfs1(cur+1,sum-a[cur],sta|(1<<(cur-1)));
}

inline void dfs2(int cur,int sum,int sta){
if (cur==n+1){
hashmap::query(sta,sum);
return;
}
dfs2(cur+1,sum,sta);
dfs2(cur+1,sum+a[cur],sta|(1<<(cur-1)));
dfs2(cur+1,sum-a[cur],sta|(1<<(cur-1)));
}

const int size[]={0,0,1,2,3,4,5,6,6,7,8,8,8,8,8,8,8,8,8,8,7};

int main()
{
freopen("t.in","r",stdin);
freopen("t.out","w",stdout);
scanf("%d",&n); if (n==1) return printf("0\n"),0;
mid=size
;
for (int i=1;i<=n;i++) scanf("%d",a+i);
dfs1(1,0,0);
dfs2(mid+1,0,0);
for (int i=1;i<(1<<n);i++)
if (cnt[i])
ans++;
printf("%d\n",ans);
return 0;
}</span>


只能去膜标算

<span style="font-family:Microsoft YaHei;font-size:14px;color:#000066;">#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<vector>
using namespace std;
typedef pair<int, int> abcd;
typedef long long ll;

vector<abcd> Solve(const vector<int> &S)
{
vector<abcd> ans;
int n=S.size();
for (int i=0;i<(1<<n);i++)
for (int j=i;;j=(j-1)&i)
{
int sum=0;
for (int k=0;k<n;k++)
if (j>>k&1) sum-=S[k]; else if (i>>k&1) sum+=S[k];
if (sum>=0) ans.push_back(abcd(sum,i));
if (j==0) break;
}
sort(ans.begin(),ans.end());
ans.resize(unique(ans.begin(),ans.end())-ans.begin());
return ans;
}

int n,ans;

int main()
{
int x;
freopen("t.in","r",stdin);
freopen("t.out","w",stdout);
scanf("%d",&n);
vector<int> SL,SR;
for (int i=0;i<n;i++)
scanf("%d",&x),i&1?SL.push_back(x):SR.push_back(x);
vector<abcd> L=Solve(SL);
vector<abcd> R=Solve(SR);
int p=0;
int q=0;
int LS=L.size();
int RS=R.size();
vector<bool> good(1<<n);
while (1)
{
while (p<LS && q<RS && L[p].first!=R[q].first)
L[p].first<R[q].first?p++:q++;
if (p==LS || q==RS) break;
int p2=p;
int q2=q;
while (p2<LS && L[p2].first==L[p].first) p2++;
while (q2<RS && R[q2].first==R[q].first) q2++;
for (int i=p;i<p2;i++)
for (int j=q;j<q2;j++)
good[L[i].second|(R[j].second<<SL.size())]=1;
p=p2;
q=q2;
}
ans=count(good.begin()+1,good.end(),true);
printf("%d\n",ans);
}</span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: