Icpc Ec-Final2024 补题记录
不写游记,因为当战犯了博客才开。
进度:AEFGHIKL
A. Hitoshizuku
[数据删除]
讲一下做法,按\(b\)排序后,相当于固定了\(\min{b_i}\)。
于是只要满足\(\max{a_j}\le b_i\)就好了,显然选择\(b\)最小的那几个最优。
于是就有了[数据删除]……
因为查询是单调的,所以动态加到堆里就好了。
submission
E. Corrupted Scoreboard Log
没调出大模拟……
爆搜复杂度就是对的,但是写的时候脑子要清醒。连我现在写的时候虽然一遍过了样例,但是用拍子才拍出错……
submission
F. Boolean Function Reconstruction
/bx 最小发达
首先给出一种构造方案,将所有\(f(x_1,x_2\dots x_n)=1\)中值为\(1\)的变量and起来,再或起来,形如\(\texttt{(a&b)|(a&c)|(b&c)|(a&b&c)}\)
这种方案不成立当且仅当\(S \subset T,f(S)>f(T)\),但因为and和or满足单调性,所以这种情况出现时便无解。
观察样例,可以发现可以将\(\texttt{(a&b)|(a&c)|(b&c)}\)优化成\(\texttt{(a&(b|c))|(b&c)}\),正确性显然。
所以说我们可以对于一个字符\(c\),可以将构造优化成如上形式,形如\(((c\&f_1)|f_2)\),再对于\(f_1,f_2\)递归构造。
但这种构造近似于\(2^n\),还不够,观察到若\(f(S)=f(T)=1,S\subsetneq T\),则\(T\)没有必要被构造。
这样就完了,当然我不会算上界
submission
G. Collatz Conjecture
花了半天时间,不知道赛时写的是什么,反正过了。
比赛建议使用皮卡打表法。
说一下官解。
视一轮操作为反复加\(B\)直到为\(A\)的倍数,那么因为\(A,B\)互质,显然操作在模\(B\)意义下具有包含\(n\)的循环。
令操作后\(n \leftarrow n'\)
则显然\(n'\le (n+(A-1)B)/A\)
当\(n\le B\)时,\(n'\le B\);当\(n>B\),\(n'<n\)。
所以最终\(n\)肯定在这个操作下在\([1,B]\)循环。
记\(p\equiv n \pmod B,p\in[1,B]\),那么题目中的循环包含\(n\)当且仅当最小非负整数\(t\)使得\(A|p+tB\)时,\(n\le p+tB\)
用exgcd做就完了。
submission
H. Staircase Museum
怎么不猜结论?怎么不猜结论?
如果一个状态合法,首先点满足二维偏序关系,其次可以通过调整满足它们都被移动到了拐点。
证明我认为还是感性理解更好。
然后对拐点求一个最长上升子序列就好了。
submission
I. Color-Balanced Tree
天涯做的,赛后看应该也很简单,猜一个结论:黑白相邻染色,到叶节点调整。
很好证。
submission
K. Exploration Boundary
先考虑怎么判合法。
对于仅有一个点集吗,可以发现边界形成时,点被划分成三部分,一类是已经确认最短距离的点,一类是边界,一类是还未被访问过的点。所以可以将边界视为障碍然后BFS判断。
多个边界判定时,我们可以发现他们的第一类点满足包含关系,但暴力判复杂度显然不对。所以可以一次性加入所有点集中的点,然后开始BFS,这样的话每次队列空后形成一条障碍时,这条障碍一定会在给定的点集中出现过,然后用类似拓扑排序删掉度数的方式做就完了。
对于构造边权,因为dijkstra根据\(dis\)递增依次访问点,所以我们令\(\Phi(i)\)为点\(i\)的势能函数,将它赋值为点\(i\)的BFS出队时间。若一条边两端点为\(u,v\),则边权赋值为\(|\Phi(u)-\Phi(v)|\),这样可以保证每个点的最短距离不同。
剩下需要实现的只有一个集合判等,可以用hash。(但是某个唐诗用int范围内的异或hash,2e5个集合不冲突概率高达0.0000453870676281613)
submission
L. Shiori
北约应该能秒的喵。
以下认为\(n,q\)同阶。
先说一下不带区间推平怎么做。
对于一个修改区间,我们以此找到该区间的最小值,并把线段树区间内等于最小值的叶节点赋为INF。重复以上过程,直到找到mex,再还原叶节点并打上加法tag。
为什么是对的?考虑一个叶节点被遍历当且仅当它的值小于mex,于是在一次操作后值至少翻倍。
一次翻倍代价为\(O(\log n)\),复杂度\(O(n\log^2 n)\)
那带上assign呢?考虑每次至多增加一个连续段,其实只要打一个区间赋值tag,在整个区间已被推平时不继续遍历就好了,复杂度还是有保证的。
虽说连续段在线段树上会被拆成\(O(\log n)\)个区间,但其实总遍历区间数还是\(O(\log n)\)的。
submission