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

来源:互联网 发布:java接口和引用 编辑:程序博客网 时间:2024/06/15 03:58

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[n];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>



0 0
原创粉丝点击