目录 题目链接 题解 题目链接 luogu P2962 [USACO09NOV]灯Lights 题解 可以折半搜索 map合并 复杂度 2^(n / 2)*logn 高斯消元后得到每个点的翻转状态 爆搜自由元得到最优翻转状态 // luogu-judger-enable-o2 #include<map> #include<queue> #include<cstdio> #include<cstring> #include<algorithm> u…
复杂度分析 假设本来是n层,本来复杂度是O(2^n),如果meet in middle那就是n/2层,那复杂度变为O( 2^(n/2) ),跟原来的复杂度相比就相当于开了个方 比如如果n=40那爆搜2^40肯定T飞,那用meet in middle的话就是2^20就可做了. 洛谷P2962 [USACO09NOV]灯Lights 灯只有35个,用二进制可以表示所有灯的状态,于是考虑搜索 1表示该灯是亮的,0表示是灭的 把某一个等和与他相邻的灯的位都置1表示该灯位置的开关,用 li 数组表示,按下…
题目传送门(内部题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\…
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];…
[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…
[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…