模拟赛10.9 解题报告
省选 \(\text{DAY2}\) 模拟赛,没人过题
T1. 徒
题意:给出一张简单无向连通图,求是否存在一个点,以这个点为起点进行 \(\text{DFS}\),每次随便选择一条未走过的边去走,直到无路可走为止,满足无论怎么走总能走过所有的边。
\(1\le n\le 10^5,\space 1\le m\le 2\times 10^5\)
首先排除不存在欧拉路径的图。
然后显然需要大力猜结论。
考场上猜对了结论,但是代码写假了
结论:一个点为合法的起(终)点,当且仅当他被所有简单环覆盖。
证明:如果被所有简单环覆盖,那么这个点无论怎么走显然都不会忽略任何一个环;如果存在一个简单环不覆盖这个点,那么我们完全可以忽略这个环。
判断一个点是否被所有简单环覆盖,可以把不连接这个点的边加进来,然后并查集判断是否存在环。
对于存在两个点度数为奇数的图,我们分别判断这两个点是否合法;
对于度数全为偶数的图,不难发现,起点一定是度数最大的点。
时间复杂度 \(O(n\alpha(n))\)。
T2. 灵石
题意:一棵树,有 \(q\) 次更新,每次给出 \(k,a_{1...k}\),然后对于每个点 \(u\),更新他的答案 \(ans[u]\):设 \(dist[u]\) 为其与 \(a_{1...k}\) 这 \(k\) 个点中的最远距离,他的答案 \(ans[u]\leftarrow \min(ans[u],dist[u])\)。
求 \(q\) 次更新后每个点的答案。
\(1\le n,q,\le 3\times10^5,\space \sum k\le 10^6\)
考虑一条链(序列)怎么做。
我们发现,每次更新只有最左边的点和最右边的点有更新贡献。
设这两个点从左到右序号分别为 \(x,y\),令 \(mid=\lfloor \frac {x+y}2 \rfloor\),那么 \(1...mid\) 用 \(y\) 更新,\(mid+1...n\) 用 \(x\) 更新,更新可以用数组保存,最后再求一遍前缀 \(\min\) 和后缀 \(\min\)。
对于一棵树:
考虑 \(a_{1...k}\) 内的直径,不难发现,只有直径两端才有更新贡献。
建立虚树求直径,然后从直径中间把树分开贡献。
实现非常麻烦,注意细节和常数,时间复杂度 \(O(q\log n+k)\)。
T3. 地雷
题意:\(n\) 个物品,每个物品 \(i\) 有四个属性 \(p_i,q_i,r_i,s_i\)。你需要以某种顺序消去这 \(n\) 个东西,消去一个物品 \(i_1\),设他当前未消去的左边的物品为 \(i_0\),右边的物品为 \(i_2\),右边的右边的物品为 \(i_3\),那么消去 \(i_1\) 的得分为 \((p_{i_0}-q_{i_1})^2+(p_{i_1}-r_{i_2})^2+(p_{i_2}-s_{i_3})^2\)(若不存在相应物品,则属性为 \(0\))。求可能的最大得分。
\(1\le n\le 70,\space |p_i|,|q_i|,|r_i|,|s_i|\le 1000\)
明显区间 \(\text{DP}\)。但是一个物品的得分还与其右边的右边的物品有关,我们需要额外记录这个信息。
设 \(f[i,j,x,y]\) 表示在 \(i-1,j+1\) 未消去的情况下,消去 \([i,j]\),并且此时 \(j+1\) 右边的是 \(x\),我们要求整个消除的过程中存在某一时刻满足 \(y\) 在第一个位置,的最大得分;设 \(g[i,j,x]=\max\limits_y\{f[i,j,x,y]\}\)。
转移时考虑枚举最后一个消去的位置 \(k\),枚举 \([k+1,j]\) 中(或者 \(j+1\))哪个物品会成为消除 \([i,k-1]\) 时“\(k\) 右边的物品”,设为 \(c\)。
那么
时间复杂度 \(O(n^6)\),常数极小可过。