最近都在学些科技,做些板子题。现在搜集一些个人觉得比较好的题目作为12月的第一个杂题集吧。
子集
首先,我们先考虑奇数长度段的情况(\(\{a_n\}\)已经排序):确定中位数为\(a_{mid}\),则我们发现答案为 左侧所有减去中位数的和 和 右侧所有减去中位数的和 的和,并除以元素个数。欲使价值最大,那么显然右侧需要靠近右端点进行选择, 而左侧需要靠近中位数进行选择。这个时候我们可以考虑使用二分答案来进行优化:简化对长度的枚举复杂度。
最近都在学些科技,做些板子题。现在搜集一些个人觉得比较好的题目作为12月的第一个杂题集吧。
首先,我们先考虑奇数长度段的情况(\(\{a_n\}\)已经排序):确定中位数为\(a_{mid}\),则我们发现答案为 左侧所有减去中位数的和 和 右侧所有减去中位数的和 的和,并除以元素个数。欲使价值最大,那么显然右侧需要靠近右端点进行选择, 而左侧需要靠近中位数进行选择。这个时候我们可以考虑使用二分答案来进行优化:简化对长度的枚举复杂度。
在全国复赛结束之后的两天都在疯狂地补文化课。周二的中午,回班偷看了一下手机就发现一堆未接电话。打开微信的时候就已经看到有人在抱怨江西省重新考试的事情了。
“我日。”
下午就踏上了去青山湖校区的地铁,正好赶上了竞赛课。
周六我穿好之前 ICPC 南昌赛的衣服,中午睡了个不存在的觉就踩油门去脑残大学了。这一次 CCF 为了防止江西省的悲剧再次发生,我可以感觉到 CCF 已经将脑残大学的考务整顿了一遍。
拿到题目,第一题 SB 题,特判将月份调大即可。第二题化简和式,我花了比较长的时间才彻底化简。第三题有点懵,第四题打了个暴力,第五题想了一会\(\Theta(n^2)\)就搞出来了\(\Theta(n)\)。写完这些之后我又回去改第三题,重新写了一遍代码就过了样例。可惜因为数组没有开两倍,我的这一部分努力化为了泡影。
简单总结,我并不认为这次 CSP-S2 的成绩能代表我的真实水平:首先,这套题远低于全国卷的难度;其次,数组开小这种傻逼事情有一定的偶然因素。所以,我认为全国卷的难度更能体现江西的水平。可惜,黄伟死妈了。
各位全国冬令营再见,我们到时候再来一决高下。
这道题是数学推理的好题。
我们考虑把所有的移动全部作为单向移动,设\(x_i\)为\(i\)向\(i – 1\)移动书本的数量。显然,如果我们要把书向右移动,那么我们就把\(x_{i + 1}\)减去相应的值即可。
这道题思路很妙。
发现算子只有\(+, -, \times\),所以路径上的解可以表示成线性组合:\(ax + b\)。我们记录从根到下、从下到根的线性组合前缀,然后我们考虑来利用前缀进行分割:就是树上差分的那种套路。
我们先考虑父亲边为:
大概这样合并:
void dfs(int u) { dep[u] = dep[fa[0][u]] + 1; for (int i = head[u]; i != -1; i = edges[i].nxt) if (edges[i].to != fa[0][u]) { fa[0][edges[i].to] = u, upweight[edges[i].to] = edges[i].weight; trs_up[edges[i].to] = trs_up[u], trs_down[edges[i].to] = trs_down[u]; if (edges[i].weight == 1) { trs_down[edges[i].to].b = (trs_down[edges[i].to].b + vi[edges[i].to]) % mod; trs_up[edges[i].to].b = (1LL * trs_up[u].a * vi[u] + trs_up[u].b) % mod; } else if (edges[i].weight == 2) { trs_down[edges[i].to].b = (trs_down[edges[i].to].b - vi[edges[i].to] + mod) % mod; trs_up[edges[i].to].b = (1LL * trs_up[edges[i].to].b - 1LL * trs_up[u].a * vi[u] % mod + mod) % mod; } else { trs_down[edges[i].to].a = 1LL * trs_down[u].a * vi[edges[i].to] % mod; trs_down[edges[i].to].b = 1LL * trs_down[u].b * vi[edges[i].to] % mod; trs_up[edges[i].to].a = 1LL * trs_up[edges[i].to].a * vi[u] % mod; } dfs(edges[i].to); } }
如何分裂边呢?我们只需要抵消掉\(a\)和\(b\)的效果即可,直接用逆元和减法就行了:考虑设置\(ax + b\)为从\(x\)到根的效果,设置\(cx + d\)为\(lca\)到根的效果,那么\(x\)到根的效果为\(ex + f\),可以列式为:
\[ e(cx + d) + f = ax + b \]
解出来就行了,然后再对\(y\)做差不多的处理就可以解决这道题了。(挺麻烦的,细节还挺多,不如打暴力)
这次比赛必须要仔细反省,不能再出现暑假的精神状态。
假设我们有很多服务器了,我们现在按天考虑,进行服务器的分配:假设有一个服务器编号集合\(\{id_i\}\),考虑一天天分配若干台,这样就可以保证每一台服务器的分配中不会出现同样的日期。
这样就可以分配完了,直接就有\(\sum a_i \leq |id_i| m\)。然后就是傻逼代码了。