杭电 OJ 暂不支持调整栈空间大小。如果使用 G++ 提交代码,并且代码中含有递归,递归层数较深,会返回 Runtime Error (STACK_OVERFLOW)。添加如下代码可以开大栈空间:
1 | int main() { |
杭电 OJ 暂不支持调整栈空间大小。如果使用 G++ 提交代码,并且代码中含有递归,递归层数较深,会返回 Runtime Error (STACK_OVERFLOW)。添加如下代码可以开大栈空间:
1 | int main() { |
题目描述
给定二维平面第一象限上的 n 个弹幕发射器。第 i 个发射器位于坐标 (xi,yi),并向四个方向之一发射一条射线(激光):
di=0:向上发射
di=1:向右发射
di=2:向下发射
di=3:向左发射
射线的照明路径包含发射器本身所在的位置。题目保证任意两个发射器不会同时在对方的照明路径上。
现在可以在平面上放置障碍物(允许放置在发射器所在的坐标上),只要障碍物位于某条射线上,就能阻挡该射线的照射。求最少需要放置多少个障碍物,才能使得所有 n 个发射器的照射路径上都至少包含一个障碍物。
输入格式
第一行包含一个整数 t(1≤t≤100),表示测试用例的数量。
每个测试用例第一行包含一个整数 n(1≤n≤300),表示发射器的数量。
接下来 n 行,每行包含三个整数 xi,yi,di(1≤xi,yi≤109,di∈{0,1,2,3}),表示发射器的坐标与发射方向。
保证所有测试用例中 n 的总和不超过 3000。
输出格式
对于每个测试用例,输出一行一个整数,表示最少需要放置的障碍物数量。
样例输入
1 | 2 |
样例输出
1 | 3 |
样例解释
在第一个测试用例中,有 6 个发射器。一种最优方案是放置 3 个障碍物,具体位置如下:
在坐标 (5,7) 处放置一个障碍物:该点覆盖了第 1 束(从 (5,5) 向上)、第 2 束(从 (3,7) 向右)以及第 5 束(从 (5,2) 向上)激光。
在坐标 (9,1) 处放置一个障碍物:该点覆盖了第 3 束(从 (9,9) 向下)以及第 4 束(从 (9,1) 向左)激光。
在坐标 (−2025,20) 处放置一个障碍物:该点覆盖了第 6 束(从 (1,20) 向左)激光。
该方案共使用了 3 个障碍物,且可以证明不存在比 3 更少的放置方案。
一种错误的图论建模方式是把激光当作左边的点,把这个障碍物当成右边的点,但是这样子建图是做不出来这道题目的,因为我们不是要让激光和障碍物一一匹配,这个非常容易就能做到。
那么要做这道题目,最重要的就是我们要把障碍物看成连边,左边的点指的是这个方向为上下的点,右边的点指的是这个方向为左右的点。

1 | void Solve() { |
AC
https://acm.hdu.edu.cn/contest/view-code?cid=1198&rid=18859
1 | // teamname: Gospel_rock |
最好显式忽略这个其他情况:

使用 offset 进行 swap,最后也要 swap 回来。

将哨兵值设置为 -1,可以避免 0-based 造成问题。

题目描述
给定一个数组 a,定义 f(a) 为将 a 划分成一个或多个连续子数组的方案数,需满足以下条件:
每个元素恰好属于一个子数组。
所有子数组的元素和都相等。
例如,对于 a=[1,1],f(a)=2,因为有两种合法的划分方案:
[1,1],此时唯一的子数组和为 2。
[1]+[1],此时两个子数组和均为 1。
给定两个整数 x 和 y。你需要构造一个长度为 x+y 的数组 a,其中包含 x 个 1 和 y 个 −1。
你需要求出在所有合法的数组 a 中,f(a) 的最小值,并将该最小值对 676767677 取模后输出。同时,你需要输出一个能达到该最小值的数组构造方案。
注意:你需要最小化的是 f(a) 本身,然后将这个最小值对 676767677 取模,而不是去最小化 f(a)mod676767677 的结果。
输入格式
第一行包含一个整数 t (1≤t≤104),表示测试用例的数量。
接下来每个测试用例包含一行,包含两个整数 x 和 y (0≤x,y≤2⋅105),保证 x+y≥1。
保证所有测试用例中 x 的总和与 y 的总和均不超过 2⋅105。
输出格式
对于每个测试用例,输出两行:
第一行输出 f(a) 的最小值对 676767677 取模的结果。
第二行输出一个达到该最小值的数组 a 的元素(用空格分隔)。
样例输入
1 | 4 |
样例输出
1 | 2 |
样例解释
在第一个测试用例中,x=2 且 y=0。唯一可能的数组是 a=[1,1],正如题目描述中所解释的,此时 f(a)=2。
在第二个测试用例中,x=1 且 y=1。一个能使 f(a) 最小化的合法数组是 a=[1,−1]。此时 f(a)=1,因为唯一能使所有子数组和相等的划分方式就是不进行任何分割(即 [[1,−1]],子数组和为 0)。
1 | void Solve() { |
AC
https://codeforces.com/contest/2211/submission/368623804
1 | // teamname: Gospel_rock |
题目描述
给定一个长度为 n 的数组 a 和一个参数 k。如果一个数组 b 满足以下条件,则称其为“很酷的”:
对于从 k 到 n 的每个下标 i,子数组 [ai−k+1,ai−k+2,…,ai] 都是子数组 [bi−k+1,bi−k+2,…,bi] 的重新排列(即两个长度为 k 的滑动窗口构成的多重集相同)。
现在给定数组 a 和数组 b。数组 a 仅包含 1 到 n 之间的整数;数组 b 包含 1 到 n 之间的整数以及 −1。
请判断是否可以通过将 b 中所有的 −1 替换为 1 到 n 之间的任意整数,使得最终的数组 b 满足上述“很酷的”条件。
输入格式
第一行包含一个整数 t(1≤t≤104),表示测试用例的数量。
每个测试用例的第一行包含两个整数 n 和 k(1≤k≤n≤2⋅105)。
第二行包含 n 个整数 a1,a2,…,an(1≤ai≤n)。
第三行包含 n 个整数 b1,b2,…,bn(1≤bi≤n 或 bi=−1)。
保证所有测试用例中 n 的总和不超过 2⋅105。
输出格式
对于每个测试用例,如果可以构造出满足条件的数组 b,输出 YES,否则输出 NO。
样例
1 | Input |
样例解释第一个测试用例:k=5。唯一的长度为 5 的子数组是整个数组本身。给定的 b 已经是 a 的一个重新排列,且没有 −1,满足条件,答案为 YES。
第二个测试用例:k=2。我们可以将所有的 −1 替换,使得 b=[2,1,2,1,2]。此时在 a 和 b 中,每一个长度为 2 的窗口要么是 [1,2] 要么是 [2,1],它们互为重新排列,因此答案为 YES。
第四个测试用例:k=1。长度为 1 的窗口意味着对应位置的元素必须完全相同。因为已知 a1=1 而 b1=2,两者不相等,所以无法满足条件,答案为 NO。

1 | void Solve() { |
1 |
题目描述
对于一个长度为 n 的未知序列 a,定义其 AND-数组 f(a) 如下:
f(a)k=∑1≤i1<i2<⋯<ik≤nai1&ai2&⋯&aik
其中 1≤k≤n,& 表示按位与操作。换句话说,f(a)k 是序列 a 中所有长度为 k 的子序列的按位与结果之和。
现在给定一个长度为 n 的序列 b,满足对于所有的 1≤i≤n,都有 bi≡f(a)i(mod109+7)。
请根据给定的序列 b,构造并输出任意一个满足条件的序列 a。
输入格式
第一行包含一个整数 t(1≤t≤104),表示测试用例的数量。
每个测试用例包含两行:
第一行包含一个整数 n(1≤n≤105),表示序列 a 和 b 的长度。
第二行包含 n 个整数 b1,b2,…,bn(0≤bi<109+7),表示序列 b。
保证存在长度为 n 且满足 0≤ai<229 的序列 a 使得条件成立。
保证所有测试用例中 n 的总和不超过 105。
输出格式
对于每个测试用例,输出 n 个整数 a1,a2,…,an(0≤ai<229),表示重构出的序列 a。如果有多个满足条件的序列,输出任意一个即可。
样例输入
1 | 3 |
样例输出
1 | 0 0 0 |
样例解释
在第二个样例中,若构造的序列 a=[5,3,6,1,7],其 f(a)4 的值为:
(a1&a2&a3&a4)+(a1&a2&a3&a5)+(a1&a2&a4&a5)+(a1&a3&a4&a5)+(a2&a3&a4&a5)=0+0+1+0+0=1。
且 f(a)1=a1+a2+a3+a4+a5=22。可以证明对于所有 1≤i≤5 均有 f(a)i=bi,因此 a=[5,3,6,1,7] 是一个合法的解。
1 |