[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>
相关文章推荐
- ASP.NET Core 发布至Linux生产环境 Ubuntu 系统
- Linux进程上下文切换过程context_switch详解--Linux进程的管理与调度(二十一)
- Linux用户抢占和内核抢占详解(概念, 实现和触发时机)--Linux进程的管理与调度(二十)
- tomcat用户登录问题
- 简易网站流量统计工具
- Linux进程核心调度器之主调度器--Linux进程的管理与调度(十九)
- Linux环境下查看jar包的归档目录
- Expression Add Operators
- Linux核心调度器之周期性调度器scheduler_tick--Linux进程的管理与调度(十八)
- 修改tomcat6.0.25日志默认路径
- apache配置VirtualHost(windows)
- 分布式架构干货收集
- Linux监控命令
- 网站缓存技术
- centos6.6下编译安装PostgreSQL9.4.1、配置phppgadmin
- linux 下安装tomcat
- Linux学习——NFS服务介绍及安装配置方法
- QPS从0到4000请求每秒,谈达达后台架构演化之路
- Centos6.5搭建Django-1.8.3+mod_wsgi+Apache环境
- 使用Java开发高性能网站需要关注的那些事儿