随笔分类 -  二分

摘要:题解 分行考虑,每一行都被火山截断为若干个区间(由于$n$数据范围较大,只考虑有火山的行)。如果上一行不存在与当前区间有交集的区间,则将其删去,判断最后是否留有可行区间即可。 具体实现:将每行的区间放入一个集合之中,对于一个区间$[l,r]\(,二分上一行中第一个左端点\)\ge l$的区间和最后一 阅读全文
posted @ 2021-09-24 15:42 violet_holmes 阅读(61) 评论(0) 推荐(0)
摘要:题目链接 题解 模拟,每次二分找下一个钉子,将绳子整除其间距离即可。 Q:时间复杂度为什么是正确的呢?为什么不会出现每次找下一个钉子都恰好只够一个距离的情况(这样单次查询时间为$O(n)$)? A:~~因为出题人不够毒瘤。~~假设已经找到了第$i-1$和第$i$根钉子,要想构造上述情况,第$i+1$ 阅读全文
posted @ 2021-07-10 11:13 violet_holmes 阅读(52) 评论(1) 推荐(0)
摘要:题目链接 题解 易得,将割边全部放在一边,让剩下的点组完全图即可得出最多边数。二分答案(\(m\)),如果$\lceil \frac{2} \rceil+\(完全图边数\)\ge m$即可行。 AC代码 #include<bits/stdc++.h> #define int long long us 阅读全文
posted @ 2021-05-01 10:24 violet_holmes 阅读(55) 评论(0) 推荐(0)
摘要:题目链接 题解 ⭐:①可以将整除的条件转化为余数为$0$。②枚举左右端点可以找寻单调性,尝试固定一端二分另一端。 暴力的话枚举左右端点,然后$O(n)$求乘积余数,总时间复杂度为$O(n^3)\(。其中区间乘积求余可以使用线段树维护,又可发现,若区间\)[i,j]$的乘积可以被$k$整除,则对于$j 阅读全文
posted @ 2021-03-13 19:12 violet_holmes 阅读(67) 评论(0) 推荐(0)
摘要:题目链接 题解 $O(nlogn)$的数据范围与求最大值最小的条件,可以想到二分答案。$check$函数只需扫一遍字符串,如果当前行到换行点的长度$>mid$的话,则采用上一个换行点。换言之就是采用每个使该行长度$\le mid$且最大的换行点,如果最后行数$>k$则返回$false$。 Tips: 阅读全文
posted @ 2021-03-11 19:26 violet_holmes 阅读(53) 评论(0) 推荐(0)
摘要:题目链接 题解 如果$k$整除两个接起来的数$a_i,a_j$,它们一定满足$k|(a_i\cdot10^+a_j)$,其中$dig_j$为$a_j$的数位。由于求余运算的可加、乘性,$a_i,a_j$需要满足$k|[(a_i%k)\cdot(10^%k)+a_j%k]$,也就是只需知道$a_i$、 阅读全文
posted @ 2021-01-10 10:22 violet_holmes 阅读(82) 评论(0) 推荐(0)
摘要:题目翻译 题解 容易想到$O(n^2)$的暴力,也就是对于每个区间依次枚举与之有重叠的区间。但是时间复杂度只允许在$O(nlogn)$及以内,因此需要考虑优化。 若使两个区间$i,j$重叠,只需满足$r_j\ge l_i$且$l_j\le r_i $,当然$i,j$可以互换,但为了不重复计数令$i$ 阅读全文
posted @ 2021-01-01 18:32 violet_holmes 阅读(100) 评论(0) 推荐(0)