[总结]模拟赛2022/1/19
[总结]2022/1/19
P1心路历程
赛时
30min看完题目,一开始认为T1、T3、T4都是最小生成树。后来慢慢看题,发现都不是。
T1写了一个类似于Dij的算法。流程如下:
- 找一个对当前贡献最大的点(贡献最大指的是:能看都最多现在没有看到的点);
- 标记找到的点以及它可以看到的点(注意,两种标记是不一样的。第一种表示以后再也选不了;第二种表示以看到的点);
ans++;
- 如果已经满足要求,输出ans。
大概30min写完。
看到T2第一感觉就是贪心,但想了大概10min考虑贪心是否是对的以及一些细节。后来写双向链表的时候写挂了,果断换题。主要是吸取了CSP的经验。
才发现T3和T4都不会,写了两个骗分程序,去改T2。
T2终于改出来了,一直呆到比赛结束。
赛后
OHOHOHOHOH!!!我T2AC了!!!但正确性我不会证啊???
T4的数据好水啊,全部加起来,都能拿25分。(有些对不起那些好好打树形dp只拿了12.5分的同学)。
T3可以用暴力+贪心???好水的数据。
P2比赛反思
- 下次可以压缩一下看题时间。最好在20min以内。
- 不要把一道题的idea照搬到其他题上,比如今天开题的时候认为3道是最小生成树。想题的时候尽量换一种心态想。
- 相信自己的感觉,其实T2没必要花10min思考对还是错,应该冲动一点。
- 多学习基础算法,比如今天T1差不多是模板的树形dp居然完全不会。
P3感想
- 数据太水了。
- 相信自己的想法,自信一点。
- 相信暴力可以
AC或拿到较高的分数。
P4题目总结
T1
赛时做法:写了一个类似于Dij的鬼东西,具体做法如上。
赛后做法:其实就是树形dp的板。但是,由于有 \(n\) 条边,所以,我们需要删掉一条边。在寻找那条边的过程中,使用dfs,记录一个节点的父亲,然后判断:如果找到了一个点,重复了两次,且不是当前节点的父亲,则当前节点与找到的节点就是我们要删的边。把这两个点记作: \(r_1,r_2\)。如下图。
然后分别以 \(r_1,r_2\) 作为根,跑一边树形dp。设 \(f_{x,0},f_{x,1}\),分别表示:以 \(r_1\) 为根的情况下,\(x\) 节点不选与选的最小答案。设 \(g_{x,0},g_{x,1}\),分别表示:以 \(r_2\) 为根的情况下,\(x\) 节点不选与选的最小答案。转移方程如下:
初始化:f[i][0]=g[i][0]=1
。
以 \(f\) 为例,解释一下:由于题目的特殊性,如果父亲不选则儿子一定都要选;但如果父亲选的话,儿子可选可不选,所以就从这两者选个最小值。
T2
贪心+双向链表,但是不会正确性的证明;区间dp比较严谨而且较好理解。
下面给出一点不算好的贪心证明。
以上图为例,先给给它从小到大排个序,然后排完序的顺序就是枚举的顺序。假如1是x,5是y,3是z。那么想要找到比\(\lvert y-x \rvert,\lvert z-x\rvert\) 更优的方案,则必须有一个节点,要干掉 \(y,z\) 的其中一个。通过题目可知,如果有其他点要干点 \(y,z\) ,则这个点比 \(y,z\) 还要大,那么方案会更差。所以,可以用贪心。
区间dp的做法是:将数组复制一遍,然后设 \(f_{l,r}\) 为l到r的最小答案。那么转移方程显而易见:f[l][r]=min(f[l][r],f[l][k+1]+f[k+1][r]+abs(max(i,k)-max(k+1,r))
T3
水过,但要打网络流,设一个超级源点s和超级汇点t,将价值为1的全部点连向s,价值为-1的连向t,这两种边流量都是1。原图中所有边流量为inf。然后就是最大流模板了。
T4 Emma不会。