牛客小白月赛22题解(非出题人)
https://ac.nowcoder.com/acm/contest/4462#question
A、操作序列
单点增加,区间求和,下标最小的非零数变成零,单点查询。
说完了不就线段树嘛。由于范围比较大,先存下来,离散化,再进行树上的操作。
注意这里的左右区间离散化值不一样的,左边离散化要找到大于等于左边界的值,右边离散化要找到小于等于右边界的值。
https://ac.nowcoder.com/acm/contest/view-submission?submissionId=43053746
B、树上子链
类似于 dp 求树直径
https://ac.nowcoder.com/acm/contest/view-submission?submissionId=43054927
C、交换游戏
暴搜,由于每次只会影响三个位置,若遍历到的三个位置可以被改变,则改变后重新搜索,搜索完了改回来,继续遍历。由于n比较小,所以跑起来非常快。
https://ac.nowcoder.com/acm/contest/view-submission?submissionId=43056615
D、收集纸片
暴搜,由于只有10个点,10案例,所以最多计算 10*10!次,直接枚举全排列算就可以了。
https://ac.nowcoder.com/acm/contest/view-submission?submissionId=43055062
E、方块涂***r />
多组输入
https://ac.nowcoder.com/acm/contest/view-submission?submissionId=43051185
F、累乘数字
直接输出
https://ac.nowcoder.com/acm/contest/view-submission?submissionId=43051080
G、仓库选址
考虑暴力的做法,枚举每个位置为仓库的位置,看起来似乎会超时,那考虑一下优化。
若仓库在点 (x,y) 处,若现在将仓库移动到点 (x+1,y) ,那么对于左下角为(1,1),右上角为(x,m)的矩阵,所有点到达仓库的距离都+1,对于左下角为(x+1,m),右上角为(n,m)的矩阵,所有点到达仓库的距离都-1.
所以我们考虑二维前缀和,暴力出仓库在(1,1)位置的答案,然后每次移动一个位置用二维前缀和来计算贡献就可以了。
(暴力也能过。。。)
https://ac.nowcoder.com/acm/contest/view-submission?submissionId=43056417
H、货物种类
考虑最多只有1e5次进货,所以 d 小于1e9 可以忽略了。
由于需要算有最多种类的仓库,我们考虑将同一种货物的所有进货区间合成一个区间,然后直接对这个区间add+1,当然,可能合并后的区间是不连续的,我们可以分多次,对它每一个连续区间add+1就可以了。
可以直接维护max max_id,但由于这个线段树代码是直接魔改了A题的线段树,并且最后再求n次单点值也不会超时,所以懒得改了(反正不会超时)
https://ac.nowcoder.com/acm/contest/view-submission?submissionId=43054475
I、工具人
占坑。
J、计算A+B
先判一遍是不是只有一个+,然后字符串模拟,注意考虑进位和前缀0情况。
https://ac.nowcoder.com/acm/contest/view-submission?submissionId=43052328
A、操作序列
单点增加,区间求和,下标最小的非零数变成零,单点查询。
说完了不就线段树嘛。由于范围比较大,先存下来,离散化,再进行树上的操作。
注意这里的左右区间离散化值不一样的,左边离散化要找到大于等于左边界的值,右边离散化要找到小于等于右边界的值。
https://ac.nowcoder.com/acm/contest/view-submission?submissionId=43053746
B、树上子链
类似于 dp 求树直径
https://ac.nowcoder.com/acm/contest/view-submission?submissionId=43054927
C、交换游戏
暴搜,由于每次只会影响三个位置,若遍历到的三个位置可以被改变,则改变后重新搜索,搜索完了改回来,继续遍历。由于n比较小,所以跑起来非常快。
https://ac.nowcoder.com/acm/contest/view-submission?submissionId=43056615
D、收集纸片
暴搜,由于只有10个点,10案例,所以最多计算 10*10!次,直接枚举全排列算就可以了。
https://ac.nowcoder.com/acm/contest/view-submission?submissionId=43055062
E、方块涂***r />
多组输入
https://ac.nowcoder.com/acm/contest/view-submission?submissionId=43051185
F、累乘数字
直接输出
https://ac.nowcoder.com/acm/contest/view-submission?submissionId=43051080
G、仓库选址
考虑暴力的做法,枚举每个位置为仓库的位置,看起来似乎会超时,那考虑一下优化。
若仓库在点 (x,y) 处,若现在将仓库移动到点 (x+1,y) ,那么对于左下角为(1,1),右上角为(x,m)的矩阵,所有点到达仓库的距离都+1,对于左下角为(x+1,m),右上角为(n,m)的矩阵,所有点到达仓库的距离都-1.
所以我们考虑二维前缀和,暴力出仓库在(1,1)位置的答案,然后每次移动一个位置用二维前缀和来计算贡献就可以了。
(暴力也能过。。。)
https://ac.nowcoder.com/acm/contest/view-submission?submissionId=43056417
H、货物种类
考虑最多只有1e5次进货,所以 d 小于1e9 可以忽略了。
由于需要算有最多种类的仓库,我们考虑将同一种货物的所有进货区间合成一个区间,然后直接对这个区间add+1,当然,可能合并后的区间是不连续的,我们可以分多次,对它每一个连续区间add+1就可以了。
可以直接维护max max_id,但由于这个线段树代码是直接魔改了A题的线段树,并且最后再求n次单点值也不会超时,所以懒得改了(反正不会超时)
https://ac.nowcoder.com/acm/contest/view-submission?submissionId=43054475
I、工具人
占坑。
J、计算A+B
先判一遍是不是只有一个+,然后字符串模拟,注意考虑进位和前缀0情况。
https://ac.nowcoder.com/acm/contest/view-submission?submissionId=43052328