BZOJ 洛谷 \(Description\) 给定\(n\)个数\(A_i\).求它有多少个子集,满足能被划分为两个和相等的集合. \(n\leq 20,1\leq A_i\leq10^8\). \(Solution\) 显然我们要预处理哪些集合可以被划分为两个和相等的集合.每个元素三种状态,这样我们就可以得到一个\(O(3^n)\)的做法.. 显然不行啊,但是和相等这种东西可以折半啊! 将序列分成两半分开DFS.这样两个和相等的集合\(S_1,S_2\)中的元素可能会被分开.设\(a\)为\…
[Usaco2012 Open]Balanced Cow Subsets 题目描述 给出\(N(1≤N≤20)\)个数\(M(i) (1 <= M(i) <= 100,000,000)\),在其中选若干个数,如果这几个数可以分成两个和相等的集合,那么方案数加\(1\). 求有多少种选数的方案. 输入输出格式 输入格式: * Line 1: The integer $ N$. * Lines 2..1+N: Line i+1 contains \(M(i)\). 输出格式: * Line 1:…
题面:SP11469 SUBSET - Balanced Cow Subsets 题解: 对于任意一个数,它要么属于集合A,要么属于集合B,要么不选它.对应以上三种情况设置三个系数1.-1.0,于是将题目转化 为找出两个集合和为0,将这两个集合合并不重复的为一种答案.考虑折半搜索.搜出前一半和后一半,用哈希表和状态压缩记录 和去重,然后统计答案即可. 时间复杂度为O(6^(N/2)). 代码: #include<cstdio> using namespace std; ,MOD=,max_nu…
BZOJ_2679_[Usaco2012 Open]Balanced Cow Subsets _meet in middle+双指针 Description Farmer John's owns N cows (2 <= N <= 20), where cow i produces M(i) units of milk each day (1 <= M(i) <= 100,000,000). FJ wants to streamline the process of milking…
2679: [Usaco2012 Open]Balanced Cow Subsets Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 462  Solved: 197[Submit][Status][Discuss] Description Farmer John's owns N cows (2 <= N <= 20), where cow i produces M(i) units of milk each day (1 <= M(i)…
[算法]折半搜索+数学计数 [题意]给定n个数(n<=20),定义一种方案为选择若干个数,这些数可以分成两个和相等的集合(不同划分方式算一种),求方案数(数字不同即方案不同). [题解] 考虑直接枚举集合的子集,再枚举子集的子集(划分方式),相当于将子集看成天平,枚举子集一些数置左,剩余数置右,则每个数有三种可能:不选,置左,置右. 由此可知,直接枚举集合子集的子集复杂度是O(3^n). 考虑将总集划分成两半,则枚举一半的复杂度为O(3^(n/2)). 得到两半都如何合并? 如果相同集合不同划分…
Description Farmer John's owns N cows (2 <= N <= 20), where cow i produces M(i) units of milk each day (1 <= M(i) <= 100,000,000). FJ wants to streamline the process of milking his cows every day, so he installs a brand new milking machine in…
考虑折半搜索,每个数的系数只能是-1,0,1之中的一个,因此可以先通过$O(3^\frac{n}{2})$的搜索分别搜索出两边每个状态的和以及数字的选择情况. 然后将后一半的状态按照和排序,$O(2^\frac{n}{2})$枚举前一半的每一个选择情况的状态,将该选择情况下所有状态按和排序,然后通过双指针求出所有合法状态. 时间复杂度$O(6^\frac{n}{2})$. #include<cstdio> #include<algorithm> const int N=20,M=1…
思路:折半搜索,每个数的状态只有三种:不选.选入集合A.选入集合B,然后就暴搜出其中一半,插入hash表,然后再暴搜另一半,在hash表里查找就好了. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; #define maxn 25 int n; int a[maxn],t[m…
嘟嘟嘟spoj 嘟嘟嘟vjudge 嘟嘟嘟luogu 这个数据范围都能想到是折半搜索. 但具体怎么搜呢? 还得扣着方程模型来想:我们把题中的两个相等的集合分别叫做左边和右边,令序列前一半中放到左边的数为\(a\),右边的数为\(b\),后一半同理为\(c\)和\(d\).则我们要找的就是满足\(a + c = b + d\)的选取方案. 然后变形\(a - b = d - c\).因此我们只要在前一半枚举\(a, b\),存起来,然后在后一半枚举\(c, d\),然后查找\(d - c\)是否出…
目录 Meet in the Middle 总结 1.算法模型 1.1 Meet in the Middle算法的适用范围 1.2Meet in the Middle的基本思想 1.3Meet in the Middle的算法过程 1.4Meet in the Middle的时间复杂度分析 2.代码实现 例题 [SPOJ ABCDEF] 法1: 结果合并法 法2:哈希表 法3:map 3.扩展运用 [BZOJ 4800] 冰球世界锦标赛 [POJ 1186] 方程的解数 [BZOJ 2679]…
思想 先搜索前一半的状态,再搜索后一半的状态,再记录两边状态相结合的答案. 暴力搜索的时间复杂度通常是 \(O(2^{n})\) 级别的.但折半搜索可以将时间复杂度降到 \(O(2 \times 2^{\frac{n}{2}})\),再加上统计答案的时间复杂度,总复杂度几乎缩小了一半. 例题 「CEOI2015 Day2」世界冰球锦标赛 题目链接 Luogu P4799 [CEOI2015 Day2]世界冰球锦标赛 分析 用折半搜索的思想,先搜索 \(0 \sim \lfloor \frac{n…
P3067 [USACO12OPEN]平衡的奶牛群Balanced Cow S… 题目描述 Farmer John's owns N cows (2 <= N <= 20), where cow i produces M(i) units of milk each day (1 <= M(i) <= 100,000,000). FJ wants to streamline the process of milking his cows every day, so he instal…
问题 A: 毛一琛/$cow$ $subsets$ 时间限制: 1 Sec  内存限制: 512 MB 题面 题面谢绝公开. 题解 题名貌似是个大神??看起来像是签到题然后就死了. 首先$O(3^n)$算法显然.也显然过不去$20$的测试点. 正解是赫赫有名的$meet$ $in$ $the$ $middle$算法.数据在40以内的都能用$meet$ $in$ $the$ $middle$?? 对于两半路径,可以拼起来并且构成合法答案的条件是两人获得的分数相同. 所以一个比较聪明的办法是,不去记…
[BZOJ4800][Ceoi2015]Ice Hockey World Championship (meet in the middle) 题面 BZOJ 洛谷 题解 裸题吧,顺手写一下... #include<iostream> #include<cstdio> #include<algorithm> using namespace std; #define ll long long inline ll read() { ll x=0;bool t=false;ch…
题目描述 历史学考后,$MYC$和$ztr$对答案,发现选择题他们没有一道选的是一样的.最后他们都考了个$C$.现在问题来了,假设他们五五开,分数恰好一样(问答题分数也恰好一样,只考虑选择题).已知考题是$N$道选择题(第$i$题分数为$M(i)$).问$ztr$和$MYC$做对的题的并有多少种可能?众所周知,历史学考选择题有$25$题,但是$MYC$为了给你降低难度,$n$不超过$20$. 一句话题意:有多少个非空子集,能划分成和相等的两份. 原题见:$USACO\ 2012\ OPEN\ G…
Meet in the middle(MITM) Tags:搜索 作业部落 评论地址 PPT中会讲的很详细 当搜索的各项互不影响(如共\(n\)个物品前\(n/2\)个物品选不选和后\(n/2\)个物品选不选互不干扰)且状态数小得可怜的时候可以考虑双向搜索(MITM) 实现非常灵活,具体看题 精髓是:用空间换时间 [x] [SPOJ4580]ABCDEF☃☃ [x] [NOI2001]方程的解数☃☃ [x] [TopCoder14580] EllysRPS☃☃☃ [x] [BZOJ4800]Ic…
搜索是\(OI\)中一个十分基础也十分重要的部分,近年来搜索题目越来越少,逐渐淡出人们的视野.但一些对搜索的优化,例如\(A\)*,迭代加深依旧会不时出现.本文讨论另一种搜索--折半搜索\((meet\ in\ the\ middle)\). 由一道例题引入:CEOI2015 Day2 世界冰球锦标赛 我们可以用以下代码解决\(n\leq 20\)的数据,时间复杂度\(O(2^n)\) void dfs(int step, int sum) { if (sum>m) return; if (st…
题意 题目链接 Sol 发现abcdef是互不相关的 那么meet in the middle一下.先算出abc的,再算def的 注意d = 0的时候不合法(害我wa了两发..) #include<bits/stdc++.h> #define LL long long using namespace std; const int MAXN = 101, SS = 2e6 + 10; map<LL, LL> mp; int N; LL a[MAXN], ans; int a1[SS]…
题意 题目链接 Sol 把前一半放在左边,后一半放在右边 meet in the middle一波 统计答案的时候开始想的是hash,然而MLE了两个点 实际上只要排序之后双指针扫一遍就行了 #include<bits/stdc++.h> using namespace std; const int MAXN = 7, MAX = 1e7 + 10; int K[MAXN], P[MAXN], N, M, ans; int a1[MAX], c1, a2[MAX], c2, cnt[MAX];…
[CF888E]Maximum Subsequence(meet in the middle) 题面 CF 洛谷 题解 把所有数分一下,然后\(meet\ in\ the\ middle\)做就好了. 一侧的数正序,另一侧倒序,这样子指针单调就做完了. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include&l…
[CF912E]Prime Game(meet in the middle) 题面 CF 懒得翻译了. 题解 一眼题. \(meet\ in\ the\ middle\)分别爆算所有可行的两组质数,然后二分答案,\(two-pointers\)扫一下就好了. #include<iostream> #include<cstdio> #include<algorithm> #include<vector> using namespace std; #define…
题目链接 Solution Meet in the middle. 考虑到 \(2^{35}\) 枚举会超时,于是分成两半枚举(尽量平均). 然后不能 \(n^2\) 去匹配,需要用到一点贪心: 将数分成 \(p,q\) 两组,那么对于任意数 \(p_i\) ; 它与 \(q\) 数组中组成最大得到的值即为 最大的与 \(p_i\) 之和不超过\(m\) 的数. 然后就可以贪心优化了. 还要注意一点就是最大的两个也要考虑一次. Code #include<bits/stdc++.h> #def…
[BZOJ4800][Ceoi2015]Ice Hockey World Championship Description 有n个物品,m块钱,给定每个物品的价格,求买物品的方案数. Input 第一行两个数n,m代表物品数量及钱数 第二行n个数,代表每个物品的价格 n<=40,m<=10^18 Output 一行一个数表示购买的方案数 (想怎么买就怎么买,当然不买也算一种) Sample Input 5 1000 100 1500 500 500 1000 Sample Output 8 题…
304. [NOI2001] 方程的解数 ★★☆   输入文件:equation1.in   输出文件:equation1.out   简单对比时间限制:3 s   内存限制:64 MB 问题描述 已知一个n元高次方程: k1xp11+k2xp22+⋯+ knxpnn=0 其中:x1, x2, …,xn是未知数,k1,k2,…,kn是系数,p1,p2,…pn是指数.且方程中的所有数均为整数. 假设未知数1≤ xi ≤M, i=1,,,n,求这个方程的整数解的个数. 输入文件 文件的第1行包含一个…
题目传送门(内部题142) 输入格式 输入文件的第一行为两个数$n,P$. 接下来一行$n$为个正整数,表示每道题的分数. 输出格式 输出一行一个正整数,为至少需要获得的分数. 样例 样例输入: 2 0.51 2 样例输出: 数据范围与提示 设一道题分数的最大值为$m$.     对于$50\%$的数据,满足$n\leqslant 20$. 对于另$20\%$的数据,满足$m\leqslant 1,000$. 对于$100\%$的数据,满足$2\leqslant n\leqslant 40,1\…
题意:给定n个数,让你给出一个数,使得n个数与给出的数异或后得到的数的二进制表示中1的数量相同 题解:考虑暴搜2^30去找答案,显然不可接受 显然可以发现,这是一个经典的meet in the middle模型,直接套用然后hash一下即可 设前15位异或完之后1的个数为ai,那么差分一下得 a1  a2-a1  a3-a2  a4-a3  ...... 设后15位异或之后1的个数为bi,那么查分一下得 b1  b2-b1  b3-b2  b4-b3  ...... 差分完之后表示的是后一个数1…
折半搜索(meet in the middle) ​ 我们经常会遇见一些暴力枚举的题目,但是由于时间复杂度太过庞大不得不放弃. ​ 由于子树分支是指数性增长,所以我们考虑将其折半优化; 前言 ​ 这个知识点曾经在模拟赛中出现过,所以这里稍微提一下; ​ 讲的很浅显,但是不要D讲者; 入门 ​ dfs搜索树是指数性增长,如果将指数减少一半,就将会有量的飞跃,所以在遇见暴力枚举太大时,我们可以考虑这种算法; ​ 总体思想即,dfs搜素通常从一个点出发,遍历所有深度,那么我们考虑将深度减半,从两个点出…
A. 毛一琛 考虑到直接枚举的话时间复杂度很高,我们运用$meet\ in\ the\ middle$的思想 一般这种思想看似主要用在搜索这类算法中 发现直接枚举时间复杂度过高考虑枚举一半另一半通过其他算法统计,保证两边互不影响 今天的题我们考虑枚举先枚举左半部分,然后每个物品有三种取值情况 选入A集合,选入B集合,不选,系数不同 考虑完左半部分再去考虑右半部分,那么我们可以用哈系表先从将左半部分的答案统计出来 然后右半部分查询他的相反数注意去重 也可以用将两边状态都用结构体存下来 注意去重 思…
前言 若干年前看过现在又忘了.这么简单都忘 所以今天来重新复习一下. 正题 考虑这样的问题: 给定 \(n\) 个物品的价格,你有 \(m\) 块钱,每件物品限买一次,求买东西的方案数. \(n\leq 40\),\(m\leq 10^{18}\). 在看到数据范围之前,所有人的想法都是直接背包,看到数据范围后就寄了. 看样子不可用背包,那就用搜索吧. 直观的,我们考虑 \(O(2^n\times n)\) 的做法. 用 \(O(2^n)\) 的复杂度枚举每个物品是否购买,再 \(O(n)\)…