思想 先搜索前一半的状态,再搜索后一半的状态,再记录两边状态相结合的答案. 暴力搜索的时间复杂度通常是 \(O(2^{n})\) 级别的.但折半搜索可以将时间复杂度降到 \(O(2 \times 2^{\frac{n}{2}})\),再加上统计答案的时间复杂度,总复杂度几乎缩小了一半. 例题 「CEOI2015 Day2」世界冰球锦标赛 题目链接 Luogu P4799 [CEOI2015 Day2]世界冰球锦标赛 分析 用折半搜索的思想,先搜索 \(0 \sim \lfloor \frac{n…
折半搜索(meet in the middle) ​ 我们经常会遇见一些暴力枚举的题目,但是由于时间复杂度太过庞大不得不放弃. ​ 由于子树分支是指数性增长,所以我们考虑将其折半优化; 前言 ​ 这个知识点曾经在模拟赛中出现过,所以这里稍微提一下; ​ 讲的很浅显,但是不要D讲者; 入门 ​ dfs搜索树是指数性增长,如果将指数减少一半,就将会有量的飞跃,所以在遇见暴力枚举太大时,我们可以考虑这种算法; ​ 总体思想即,dfs搜素通常从一个点出发,遍历所有深度,那么我们考虑将深度减半,从两个点出…
LOJ3044. 「ZJOI2019」Minimax 搜索 https://loj.ac/problem/3044 分析: 假设\(w(1)=W\),那么使得这个值变化只会有两三种可能,比\(W\)小的值变成\(W+1\),比\(W\)大的值变成\(W-1\),或直接修改\(W\). 先考虑第一部分,设\(f_{x}\)表示只改变权值\(<W\)的节点,\(x\)节点权值\(\le W\)的概率,这样能推出\(dp\)式子 \(f_x=\prod\limits_{t}f_t​\) \((dep_…
Loj #3044. 「ZJOI2019」Minimax 搜索 题目描述 九条可怜是一个喜欢玩游戏的女孩子.为了增强自己的游戏水平,她想要用理论的武器武装自己.这道题和著名的 Minimax 搜索有关. 可怜有一棵有根树,根节点编号为 \(1\).定义根节点的深度为 \(1\),其他节点的深度为它的父亲的深度加一.同时在叶子节点权值给定的情况下,可怜用如下方式定义了每一个非节点的权值: - 对于深度为奇数的非叶子节点,它的权值是它所有子节点的权值最大值. - 对于深度为偶数的非叶子节点,它的权值…
LOJ#3044. 「ZJOI2019」Minimax 搜索 一个菜鸡的50pts暴力 设\(dp[u][j]\)表示\(u\)用\(j\)次操作能使得\(u\)的大小改变的方案数 设每个点的初始答案是\(S[u]\) 每个数大小只和\(S[1]\)的大小关系有关 于是每个数的状态设为-1(比S[1]小),1(比S[1]大),0(和S[1]一样) 状态里设的改变是指在这三种状态里的一种变为另一种 如果\(S[u] == S[1]\)或者\(u\)点取max但是\(S[u] < S[1]\),\(…
目录 写在前面 定义 引入 构造 暴力 字典图优化 匹配 在线 离线 复杂度 完整代码 例题 P3796 [模板]AC 自动机(加强版) P3808 [模板]AC 自动机(简单版) 「JSOI2007」文本生成器 「BJOI2019」奥术神杖 「SDOI2014」数数 「NOI2011」阿狸的打字机 写在最后 写在前面 这篇文章的主体是在没网的悲惨状况下完成的. 前置知识:Trie 树,DFA,KMP 字符串匹配算法. 请务必深刻理解! 定义 \(|\sum|\):字符集大小,在大多数题目中都等…
目录 写在前面 引入 求解 特判优化 代码 例题 「ZJOI2010」数字计数 「AHOI2009」同类分布 套路题们 「SDOI2014」数数 写在最后 写在前面 19 年前听 zlq 讲课的时候学的东西,当时只会抄板子,现在来重学一波= = 一个板子水一天题(不事 引入 「SCOI2009」Windy 数 给定参数 \(l,r\),求 \([l,r]\) 中不含前导零且相邻两个数字之差至少为 \(2\) 的正整数的个数. \(1\le l\le r\le 2\times 10^9\). 1S…
传送门 Solution 叶子节点的变化区间是连续的,可得知非叶子节点的权值变化区间也是连续的 由此可知,\(W\)的变化值的可行域也是连续的,所以只需要看它能否变为\(W+1\)或\(W-1\) 对于答案,可以先求消耗能量不超过\(k\)的集合数\(ans_k\),再进行查分 发现\(ans_1=2^{m-1},ans_n=2^{m}-1\) 首先发现,如果要将\(W\)的值\(+1\),那么只会去动那些\(\leq W\)的的节点,让它们的权值变大 类似的,我们发现处理的两类节点无交,所以可…
题目传送门 容易想到一种暴力 DP:先转化成对于每个 \(k\) 求出 \(\max_{i\in S}|i-w_i|\le k\) 的方案数,最后差分 然后问题转化成每个叶子的权值有个取值区间,注意这时我们可以把每个点的权值分成 \(<W,=W,>W\)(看作 \(0,1,2\) )三类处理,然后 DP \(f[u][0/1/2]\) 然后你会很快发现这么做不行,因为选取某些叶子集合时,根节点的权值可以小于 \(W\) 也可以大于 \(W\) ,直接用 \(2^m-1\) 减掉 \(f[u][…
总之我也不知道这个奇怪的名字是怎么来的. \(Min\_25\)筛用来计算一类积性函数前缀和. 如果一个积性函数\(F(x)\)在质数单点是一个可以快速计算的关于此质数的多项式. 那么可以用\(Min\_25筛\). 这个东西和质数关系很大. 我们考虑分开处理质数和非质数的贡献. 首先处理质数: 设,\(R(n)\)为\(n\)的最小质因子,\(P\)为质因子集合,\(p_i\)为从小到大第\(i\)个质数. \(\forall\ x\in P,F(x)=x^k\). 设: \[g(n,j)=\…
我们可以发现最多只会进行5次操作. 由此我们从双向跑dfs,用一个unordered_map来保存状态,枚举一下两边的深度即可. 如果4次仍然不可行,则只有可能是5次.所以正反最多只需要搜2层 code: #include<cstdio> #include<tr1/unordered_map> #include<algorithm> #include<queue> using namespace std; using namespace std :: tr1…
[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:…
搜索是\(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…
「ZJOI2019」&「十二省联考 2019」题解索引 「ZJOI2019」 「ZJOI2019」线段树 「ZJOI2019」Minimax 搜索 「十二省联考 2019」 「十二省联考 2019」异或粽子 「十二省联考 2019」字符串问题 「十二省联考 2019」春节十二响…
「学习笔记」Min25筛 前言 周指导今天模拟赛五分钟秒第一题,十分钟说第二题是 \(\text{Min25}​\) 筛板子题,要不是第三题出题人数据范围给错了,周指导十五分钟就 \(\text{AK}​\) 了,为了向 \(\text{AK}​\)王 学习,真诚的膜拜他,接受红太阳的指导,下午就学习了一下 \(\text{Min25}​\) 筛. 简介 如果 \(f(n)\) 是一个积性函数,且 \(f(n)\) 是一个关于 \(n\) 的简单多项式,并可以快速算出 \(f(p^k),\ p\…
目录 「学习笔记」FFT 之优化--NTT 前言 引入 快速数论变换--NTT 一些引申问题及解决方法 三模数 NTT 拆系数 FFT (MTT) 「学习笔记」FFT 之优化--NTT 前言 \(NTT\) 在某种意义上说,应该属于 \(FFT\) 的一种优化. --因而必备知识肯定要有 \(FFT\) 啦... 如果不知道 \(FFT\) 的大佬可以走这里 引入 在 \(FFT\) 中,为了能计算单位原根 \(\omega\) ,我们使用了 \(\text{C++}\) 的 math 库中的…
目录 「学习笔记」FFT 快速傅里叶变换 啥是 FFT 呀?它可以干什么? 必备芝士 点值表示 复数 傅立叶正变换 傅里叶逆变换 FFT 的代码实现 还会有的 NTT 和三模数 NTT... 「学习笔记」FFT 快速傅里叶变换 几个星期之后,继 扩展欧拉定理 之后, \(lj\) 大佬又给我们来了一发数论... 虽然听得心态爆炸, 但是还好的是没有 \(ymx\) 大佬的飞机开得好... 至少我还没有坐飞机... 啥是 FFT 呀?它可以干什么? 首先,你需要知道 矩阵乘法 的相关知识. 通过…
「学习笔记」Treap 前言 什么是 Treap ? 二叉搜索树 (Binary Search Tree/Binary Sort Tree/BST) 基础定义 查找元素 插入元素 删除元素 查找后继 平衡性问题讨论 经典例题 堆 (Heap) 查询操作 插入操作 删除操作 随机二叉查找树 (Treap) 基础定义 Treap 维护平衡的原理--旋转操作 插入操作 删除操作 其他操作 调试技巧 前言 HuaQiMoAo 大佬 GuoShaoYang 大佬 且部分图片可能来源于这两位大佬. 本人太菜…
「ExLucas」学习笔记 前置芝士 中国剩余定理 \(CRT\) \(Lucas\) 定理 \(ExGCD\) 亿点点数学知识 给龙蝶打波广告 Lucas 定理 \(C^m_n = C^{m\% mod}_{n\% mod} \times C^{\frac{m}{mod}}_{\frac{n}{mod}}\) 适用条件 给出的数据范围较大(无法用线性求出) 模数很烂的时候(会使阶乘中出现 \(0\)) \(mod\) 必须为质数 证明 证明很恶心,略. 模板 某谷P4720 #include…
A. 毛一琛 考虑到直接枚举的话时间复杂度很高,我们运用$meet\ in\ the\ middle$的思想 一般这种思想看似主要用在搜索这类算法中 发现直接枚举时间复杂度过高考虑枚举一半另一半通过其他算法统计,保证两边互不影响 今天的题我们考虑枚举先枚举左半部分,然后每个物品有三种取值情况 选入A集合,选入B集合,不选,系数不同 考虑完左半部分再去考虑右半部分,那么我们可以用哈系表先从将左半部分的答案统计出来 然后右半部分查询他的相反数注意去重 也可以用将两边状态都用结构体存下来 注意去重 思…
「干货」面试官问我如何快速搜索10万个矩形?--我说RBUSH 前言 亲爱的coder们,我又来了,一个喜欢图形的程序员‍,前几篇文章一直都在教大家怎么画地图.画折线图.画烟花,难道图形就是这样嘛,当然不是,一个很简单的问题, 如果我在canvas中画了10万个点,鼠标在画布上移动,靠近哪一个点,哪一个点高亮.有同学就说遇事不决 用for循环遍历哇,我也知道可以用循环解决哇,循环解决几百个点可以,如果是几万甚至几百万个点你还循环,你想让用户等死?这时就引入今天的主角他来了就是Rbush RBUS…
承接上文 (完结撒花1-52系列)[JVM技术指南]「JVM总结笔记」Java虚拟机垃圾回收认知和调优的"思南(司南)"[上部] 并行收集器 并行收集器(也称为吞吐量收集器)是类似于串行收集器的分代收集器. 串行和并行收集器之间的主要区别是,并行收集器有多个线程,用于加速垃圾回收. 通过命令行选项 -XX:+UseParallelGC 启用并行收集器. 默认情况下,使用此选项,次要(minor)和主要(Major GC)都将并行运行,以进一步减少垃圾回收开销. 并行垃圾收集器线程数 可…
一.简介 前置知识:多项式乘法与 FFT. FFT 涉及大量 double 类型数据操作和 \(\sin,\cos\) 运算,会产生误差.快速数论变换(Number Theoretic Transform,简称 NTT)在 FFT 的基础上,优化了常数及误差. NTT 其实就是把 FFT 中的单位根换成了原根. NTT 解决的是多项式乘法带模数的情况,可以说有些受模数的限制,多项式系数应为整数. 二.原根 与 NTT 「算法笔记」基础数论 2 中提及了原根的部分内容. 对于质数 \(p\),若…
引入 假设我们想计算 \(f(x) = x!\).除了简单的 for 循环,我们也可以使用递归. 递归是什么意思呢?我们可以把 \(f(x)\) 用 \(f(x - 1)\) 表示,即 \(f(x) = x \times f(x - 1)\).这样,我们就可以不断地递归下去. 但是,这是永远不会停止的.我们需要设立一个边界条件,\(f(0) = 1\).这样,我们就可以写出代码了. int f(int x) {return x ? x * f(x - 1) : 1;} 实际上,递归有两大要点:…
「学习笔记」字符串基础:Hash,KMP与Trie 点击查看目录 目录 「学习笔记」字符串基础:Hash,KMP与Trie Hash 算法 代码 KMP 算法 前置知识:\(\text{Border}\) 思路 代码 \(\text{KMP}\) 匹配 思路 代码 Trie 数据结构 01-Trie 代码 练习题 Hash Bovine Genomics 思路 代码 [TJOI2018]碱基序列 思路 代码 [CQOI2014]通配符匹配 [NOI2017] 蚯蚓排队 思路 代码 KMP See…
问题引入 先让我们看一个简单的问题,有N个元素,Q次操作,每次操作需要求出一段区间内的最大/小值. 这就是著名的RMQ问题. RMQ问题的解法有很多,如线段树.单调队列(某些情况下).ST表等.这里主要探讨ST表 过程 ST表是一种神奇的算法,它以倍增与二进制为基础,实现区间内最大/小值.话不多说,直接切入正题-- 我们这里以求区间最大值为例. 首先,我们可以用O(\(N lg N\))的时间复杂度预处理出以i开始,接下来2j个元素中的最大值.我们借助递推/DP的思想. for ( int i…
[CEOI2015 Day2]世界冰球锦标赛 题目描述 译自 CEOI2015 Day2 T1「Ice Hockey World Championship」 今年的世界冰球锦标赛在捷克举行.\(Bobek\) 已经抵达布拉格,他不是任何团队的粉丝,也没有时间观念.他只是单纯的想去看几场比赛.如果他有足够的钱,他会去看所有的比赛.不幸的是,他的财产十分有限,他决定把所有财产都用来买门票. 给出 \(Bobek\) 的预算和每场比赛的票价,试求:如果总票价不超过预算,他有多少种观赛方案.如果存在以其…
从 13 年专科毕业开始,一路跌跌撞撞走了很多弯路,做过餐厅服务员,进过工厂干过流水线,做过客服,干过电话销售可以说经历相当的“丰富”. 最后的机缘巧合下,走上了前端开发之路,作为一个非计算机专业且低学历的人来说,自学编程其实不是件容易的事情,不过庆幸的是自己坚持下来了. 目前工作还算不错,收入在目前所在的城市不算高,不算低,生活也还过得去,继续加油努力,也希望自己在今后更上一层. 从 16 年下半年开始,我真正接触前端,到现在 2 年多的时间.开始之初,我没有任何的语言基础,完全从零的小白开始…
写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉:既可让人明白「为何如此设计」,即「知其然更知其所以然」:也能剥离一些琐碎的细节,让更多没那么多时间与精力.或者背景知识不足的朋友,对核心方法和思路,多一点理解,即,给人提供一种「纲举目张提纲挈领抽丝剥茧」的可能性. 机缘巧合,俺今天就决定抛砖引玉,写一篇不那么好的工程文档.也期望对本文话题感兴趣的朋…
我是擅(倾)长(向)把一篇文章写成杂文的.毕竟,写博客记录生活点滴,比不得发 paper,要求字斟句酌八股结构到位:风格偏杂文一点,也是没人拒稿的.这么说来,arxiv 就好比是 paper 世界的博客,整了篇论文,管他三七二十一,放到 arxiv 上自嗨一番(如果不是自鸣得意的话)再说…… 话说在优酷看了个电影<北京爱情故事>.记得当初电视剧的主题曲满大街放的时候,我还不知道有这么一电视剧:机缘巧合,某次宿舍里见朋友在看,才跟着一起看了两集,觉得不错,不过,之后自己也没再看过.今儿晚上看了同…