摘要:
不愧是数学场…… 题意 有 \(t\) 组数据,每组数据中包含一个 \(n\) 以及一个包含 \(n\) 个元素的序列 \(a\),请在这个序列中添加一些数使得对于每一个原始元素以及加入的元素都存在 \(a_i\leqslant i\)。输出至少需要加多少数达到目标。 数据范围:\(1\leqsla 阅读全文
摘要:
考场上想出了近似做法,可惜没有实现出来。 题意 有 \(t\) 组数据,每组都是一个有 \(n\) 个元素的序列 \(a\),考虑将此序列分割成若干段。假设第 \(i\) 段的 LIS(最长上升子序列)长度为 \(h_i\),请问是否有一种分割方式使得 \(h_1 \oplus h_2\oplus\ 阅读全文
摘要:
思路 求最大值,不是二分答案就是贪心。这里很难二分所以考虑贪心。很容易想到贪心策略,从左往右扫,右侧的数 \(<0\) 就减,右侧的数 \(>0\) 就加,如果右侧的数是 \(0\) 无所谓。 考虑证明。对于 \(2\) 个数(假设第一个是 \(x\),第二个是 \(y\))的情况明显有: 当 \( 阅读全文
摘要:
这题非常有意思。 思路和代码 首先观察那份 Pascal 代码,由于 Pascal 代码非常好懂,即使是 C++ 党也能轻易看懂,所以这里不再赘述分析过程。我们可以转出下面的代码: for(int i=n-1;i>=1;i--){ cnt++; if(n%i==0){ break; } } cout 阅读全文
摘要:
思路 模拟。 考虑计算字符串中匹配括号的个数。因为每一个匹配括号组一定对应了一个()的子序列,而我们需要使得匹配的括号子序列最多,所以匹配括号的个数一定等于匹配括号子序列的最多个数。 先求一下匹配括号的个数,看看是不是 \(\geqslant m\) 即可。 代码 非常好写。 void solve( 阅读全文
摘要:
思路 题意其它题解已经写得很明确了。 一道简单的模拟,按照题意模拟即可。 首先把字符串转换成一堆数,然后按照题目中的操作一直操作道得到的字符串长度为 \(3\),再检查这个字符串是否为100。 代码 2.1 将字符串转成数 这一步只在最开始的时候有作用。 string tostr(int t){ s 阅读全文
摘要:
思路 考虑先构造数列使得乘积等于 \(n\)。 明显地,直接对 \(n\) 分解质因数即可。由于这样分解出来的数列具有最小和,所以判断仅由 \(n\) 质因数组成的数列和 \(sum\) 与 \(k\) 的大小关系即可。 如果 \(sum=k\),就可以直接输出了。但是 \(sum<k\) 怎么办呢 阅读全文
摘要:
思路 考虑先确定一个数可不可以被报出来。 考虑递归定义布尔函数 \(f(x)\) 表示 \(x\) 不可以报出来,那么: \[ \begin{cases} 1, &f(x\bmod 10)\land x\bmod 10\neq 7 \\ 1, &\forall y|x\land f(y) \\ 0, 阅读全文
摘要:
思路 直接想法,为了使后面的一个数不能够被前面的那个数整除,只需要保证前后两个数都是质数就可以了。 但是我们并不想算多少以内能够有 \(1000\) 个质数,所以我们搞线性筛,处理 \(10^7\) 内的质数(其实并不需要这么多,请读者自行尝试处理多少以内就够了)。 代码 2.1 线性筛 如果你还不 阅读全文
摘要:
前置知识 您需要知道如何求桥,否则请移步 P1656 炸铁路 的 Tarjan 做法。 您需要知道边双连通分量的基本性质。 思路 提示:接下来所有形似“\(u\to v\) 路径的点权和”的描述中,点权和都包括 \(u,v\) 的点权。 当火星猫走过一条路之后,这条路就不能再走了 从这句话我们可以想 阅读全文