传送门

Solution

折半搜索模板题

考虑枚举每个点在左集合和右集合或者不在集合中,然后排序合并即可

Code

  1. //By Menteur_Hxy
  2. #include <cmath>
  3. #include <cstdio>
  4. #include <cstdlib>
  5. #include <cstring>
  6. #include <iostream>
  7. #include <algorithm>
  8. #define Re register
  9. #define Ms(a,b) memset(a,(b),sizeof(a))
  10. #define Fo(i,a,b) for(Re int i=(a),_=(b);i<=_;i++)
  11. #define Ro(i,a,b) for(Re int i=(b),_=(a);i>=_;i--)
  12. #define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<16,stdin)),p1==p2?EOF:*p1++)
  13. using namespace std;
  14. typedef long long LL;
  15. char buf[1<<16],*p1,*p2;
  16. inline int read() {
  17. int x=0,f=1; char c=getchar();
  18. while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}
  19. while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();
  20. return x*f;
  21. }
  22. inline void writ(int x) {
  23. if(x>9) writ(x/10);
  24. putchar(x%10+'0');
  25. }
  26. const int N=25,M=1e8+5;
  27. int n,ans,tt1,tt2;
  28. bool vis[1<<N];
  29. int da[N];
  30. struct Data{int val,cur;}T1[1<<N],T2[1<<N];
  31. void dfs(int pos,int ed,int sum,int S) {
  32. if(pos>ed) {
  33. if(ed==n/2) T1[++tt1].val=sum,T1[tt1].cur=S;
  34. else T2[++tt2].val=sum,T2[tt2].cur=S;//1
  35. return ;
  36. }
  37. dfs(pos+1,ed,sum,S);
  38. dfs(pos+1,ed,sum+da[pos],S|(1<<(pos-1)));
  39. dfs(pos+1,ed,sum-da[pos],S|(1<<(pos-1)));
  40. }
  41. bool cmp1(Data a,Data b) {return a.val<b.val;}
  42. bool cmp2(Data a,Data b) {return a.val>b.val;}
  43. int main() {
  44. n=read();
  45. Fo(i,1,n) da[i]=read();
  46. dfs(1,n/2,0,0); dfs(n/2+1,n,0,0);
  47. sort(T1+1,T1+1+tt1,cmp1);
  48. sort(T2+1,T2+1+tt2,cmp2);
  49. int l=1,r=1,las;
  50. while(l<=tt1&&r<=tt2) {
  51. while(r<=tt2&&T1[l].val+T2[r].val>0) r++;//2
  52. las=r;
  53. while(r<=tt2&&T1[l].val+T2[r].val==0) {
  54. if(!vis[T1[l].cur|T2[r].cur])
  55. vis[T1[l].cur|T2[r].cur]++,ans++;
  56. r++;
  57. }
  58. l++;
  59. if(T1[l-1].val==T1[l].val) r=las;//3
  60. }
  61. writ(ans-1);
  62. return 0;
  63. }

[luogu3067 USACO12OPEN] 平衡的奶牛群的更多相关文章

  1. 洛谷 P3067 [USACO12OPEN]平衡的奶牛群Balanced Cow S…

    P3067 [USACO12OPEN]平衡的奶牛群Balanced Cow S… 题目描述 Farmer John's owns N cows (2 <= N <= 20), where ...

  2. 折半搜索+状态压缩【P3067】 [USACO12OPEN]平衡的奶牛群Balanced Cow S…

    Description 给n个数,从中任意选出一些数,使这些数能分成和相等的两组. 求有多少种选数的方案. Input 第\(1\)行:一个整数\(N\) 第\(2\)到\(N+1\)行,包含一个整数 ...

  3. Luogu3067 平衡的奶牛群 Meet in the middle

    题意:给出$N$个范围在$[1,10^8]$内的整数,问有多少种取数方案使得取出来的数能够分成两个和相等的集合.$N \leq 20$ 发现爆搜是$O(3^N)$的,所以考虑双向搜索. 先把前$3^\ ...

  4. P3067 [USACO12OPEN]平衡的奶牛群(折半暴搜)

    暴搜无疑.... 首先考虑纯暴搜...... 考虑每一个数: 选在左边集合 选在右边集合 不选 一共三种情况,用一个数组记录搜到的答案,所以暴搜是3^N的复杂度...直接死亡 于是讲折半暴搜.... ...

  5. 洛谷P1472 奶牛家谱 Cow Pedigrees

    P1472 奶牛家谱 Cow Pedigrees 102通过 193提交 题目提供者该用户不存在 标签USACO 难度普及+/提高 提交  讨论  题解 最新讨论 暂时没有讨论 题目描述 农民约翰准备 ...

  6. 【USACO 2.3.2】奶牛家谱

    [题目描述] 农民约翰准备购买一群新奶牛.在这个新的奶牛群中,每一个母亲奶牛都生两小奶牛.这些奶牛间的关系可以用二叉树来表示.这些二叉树总共有N个节点(3 <= N < 200).这些二叉 ...

  7. Meet in the middle

    搜索是\(OI\)中一个十分基础也十分重要的部分,近年来搜索题目越来越少,逐渐淡出人们的视野.但一些对搜索的优化,例如\(A\)*,迭代加深依旧会不时出现.本文讨论另一种搜索--折半搜索\((meet ...

  8. 2017清北学堂(提高组精英班)集训笔记——动态规划Part3

    现在是晚上十二点半,好累(无奈脸),接着给各位——也是给自己,更新笔记吧~ 序列型状态划分: 经典例题:乘积最大(Luogu 1018) * 设有一个长度为 N 的数字串,要求选手使用 K 个乘号将它 ...

  9. 洛谷P3068 [USACO13JAN]派对邀请函Party Invitations

    P3068 [USACO13JAN]派对邀请函Party Invitations 题目描述 Farmer John is throwing a party and wants to invite so ...

随机推荐

  1. 8-13 canvas专题-阶段练习二(下)

    8-13 canvas专题-阶段练习二(下) <!DOCTYPE html> <html lang="zh-cn"> <head> <me ...

  2. 2018.09.09 DL24 Day2总结

    今天挂的有点惨…… T1.forging 这道题自己在考试的时候想出来了…… 这题是一个期望递推.我们首先考虑这么一件事,一枚硬币,你抛到正面停止,抛到反面继续抛,问期望抛的次数.是两次.我们假设期望 ...

  3. backbone源代码注释(部分)

    // Backbone.js 1.0.0 // (c) 2010-2013 Jeremy Ashkenas, DocumentCloud Inc. // Backbone may be freely ...

  4. linux centos7 安装mysql-5.7.17教程(图解)

    1系统约定安装文件下载目录:/data/softwareMysql目录安装位置:/usr/local/mysql数据库保存位置:/data/mysql日志保存位置:/data/log/mysql 2下 ...

  5. bzoj 1029: [JSOI2007]建筑抢修【贪心+堆】

    第一想法是按照结束时间贪心,但是这样有反例 所以先按照t贪心,能选则选,把选的楼的持续时间放进大根堆里,当当前的楼不能选的时候如果当前的持续时间比大根堆里最大的要小,就用这个替换最大,这样总数不变但是 ...

  6. P3953 逛公园(dp,最短路)

    P3953 逛公园 题目描述 策策同学特别喜欢逛公园.公园可以看成一张NN个点MM条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,NN号点是公园的出口,每条边有一个非负权值, 代表策策经 ...

  7. 实数类型c++

    数据类型 定义标识符 数值范围 占字节数 有效位数 单精度浮点数 float -3.4E+38-3.4E+38 4(32位) 6-7位 双精度浮点数 double -1.7E+308-1.7E+308 ...

  8. 转 phpmyadmin操作技巧:如何在phpmyadmin里面复制mysql数据库?

    对于每一个站长而言,都会遇到要进行网站测试的时候.这个时候,往往需要备份数据库.如果按照一般的操作方式,都是先把数据库导出并备份到本地,然后再服务器上测试.如果一切正常还好,一旦出了问题,就又得把数据 ...

  9. mysql 5.7 显示中文

    思路: 那网页xxx.php的工作过程就是这样的啦:从xxx.php页面上输入汉字,因为xxx.php是UTF8编码的,所以xxx.php以UTF8格式转换输入的汉字,然后以UTF8提交给mysql, ...

  10. TensorFlow---image recognition--classify_image运行、文件说明与错误(路径)解决

    tutorial系列mnist已经玩过了,这篇玩一下 classify_image,其实就是image label.模型已经训练好的了,直接下载下来在.pb文件中. 本机环境: Win10 + Pyt ...