做题记录 25.1.25
\(\textcolor{purple}\odot\) P2757 [国家集训队] 等差子序列
显然等价于判断是否存在 \(1\le x<y<z\le n\),使得 \(a_x,a_y,a_z\) 构成等差数列
考虑枚举中位数 \(a_y\),显然某个不为 \(a_y\) 的数必在其左侧或右侧
令 \(ct_i\) 表示当前前缀中是否有 \(i\),则转化为查询数组关于 \(y\) 是否回文(若某一侧较长则忽略多余部分)
线段树维护正向和反向的哈希即可
双哈希会被卡常
时间复杂度 \(O(n\log n)\)
\(\textcolor{purple}\odot\) P9128 [USACO23FEB] Fertilizing Pastures G
\(T=0\) 时,第一问显然为 \(2n-2\),后一问考虑 \(dp\),令 \(f_{i}\) 表示从 \(i\) 出发,遍历 \(i\) 中子树,且回到 \(i\) 所需的最小时间,令 \(sa_i\) 表示子树 \(i\) 中 \(a\) 的总和,令 \(sz_i\) 表示子树 \(i\) 的大小,则
其中 \(p_{1\sim t}\) 为其儿子的排列
易证将所有儿子按 \(\frac {sa}{sz}\) 从小到大排序最优
总时间复杂度 \(O(n\log n)\)
\(T=1\) 时,显然最后会在深度最大的叶子结束,因此第一问答案为 \(2n-2-d\),其中 \(d\) 为最大深度
对于后一问,令 \(g_i\) 表是子树 \(i\) 不需要回到 \(i\) 的答案,则
其中 \(p_{1\sim t}\) 为其儿子的排列,且 \(p_t\) 为子树高最大的儿子之一
枚举该儿子,在 \(f_i\) 中去掉其影响,再加上其贡献,合法情况取最小即可
总时间复杂度 \(O(n\log n)\)
\(\textcolor{purple}\odot\) P2566 [SCOI2009] 围豆豆
每个豆子引出一条射线,若经过奇数次则在内部
若射线起点为 \((x,y)\),则从 \((u,v)\) 走到 \((u,v+1)\),或从 \((u,v+1)\) 走到 \((u,v)\) 的一步称为经过,其中 \(u>x\)
枚举路径起点 \((x,y)\),设 \(dp_{i,j,s}\) 表示走到 \((i,j)\),每个豆子对应射线经过次数的奇偶状态为 \(s\) 的最小步数,直接 \(bfs\) 即可
时间复杂度 \(O(n^2m^22^d)\)
\(\textcolor{purple}\odot\) P2685 [TJOI2012] 桥
即查询所有去掉一条边的方案中,\(1\) 到 \(n\) 的最短路的最大值
先求出任意一条最短路,假设点依次为 \(p_1,p_2,\cdots,p_t\),其中 \(p_1=1,p_t=n\)
令 \(l_u\) 为 \(1-u\) 的最短路上最后一个在 \(p_{1\sim t}\) 中的点,令 \(r_u\) 为 \(u-n\) 的最短路上第一个在 \(p_{1\sim t}\) 中的点(可处理出每个点到 \(1\) 的最短路后通过一次 \(bfs\) 求出 \(l\),\(r\) 同理)
则对于不在该最短路上的边 \(u-v\),若删去 \(l_u\) 和 \(r_v\) 之间某一边(假定 \(p_{1\sim t}\) 中 \(l_u\) 在 \(r_v\) 之前),最短路可能变为 \(1-l_u-u-v-r_v-n\),容易通过处理快速求出其长度
建立长为 \(t-1\) 的线段树,位置 \(i\) 对应 \(p_i\) 到 \(p_{i+1}\) 的边,存储若删去这条边,最短路可能变为的最小值
对于 \(u-v\),其令线段树上 \(l_u\) 到 \(r_v\) 对应区间对 \(1-l_u-u-v-r_v-n\) 的长度取 \(\min\)
第一问即为最终线段树中的最大值,记为 \(mxd\)
对于第二问,若 \(mxd\) 不等于原图中 \(1\) 到 \(n\) 的最短路,则选择的边显然只能在最短路上,答案为线段树上等于 \(mxd\) 的位置数量
若等于最短路长,则任意一条边均可,答案为 \(m\)
总时间复杂度 \(O((n+m)\log n)\),瓶颈在于 \(dijkstra\)
细节较多
相似题
\(\textcolor{blue}\odot\) P1186 玛丽卡 \(\quad\) 代码
\(\textcolor{blue}\odot\) CF1278E Tests for problem D
设 \(u\) 的儿子为 \(s_{1\sim t}\),则构造 \(s_{1\sim t}\) 的左端点依次为 \(l-t\sim l-1\),其中 \(l\) 为 \(u\) 的左端点,\(u\) 的父亲(如果存在)的右端点为 \(l-t-1\),构造 \(s_{t+1}\) 的右端点为子树 \(s_t\) 中区间的并的右端点加一
\(\textcolor{purple}\odot\) P2839 [国家集训队] middle
二分答案,小于的设为 \(-1\),其余设为 \(+1\),转化为求左端点在 \([a,b]\),右端点在 \([c,d]\) 中最大的和,判断是否有和 \(\ge 0\)
拆为查询 \([b,c]\) 内的和、\([a,b)\) 内的最大后缀和、\((c,d]\) 内的最大前缀和
对每个值计算出该数组,从小到大枚举值则 \(+1\) 变为 \(-1\) 次数为 \(O(n)\) 的,用主席树存储
对离散化后的值二分可做到总时间复杂度 \(O(n\log n+q\log^2 n)\),空间 \(O(n\log n)\)
数据范围应该可以加强到 \(2\times10^5\) 的级别
\(\textcolor{purple}\odot\) [AGC043D] Merge Triplets
对于同一块中三个数 \(x,y,z\)
- 若 \(x>y\) 且 \(x>z\),则在最终排列中三者连续
- 若 \(x>y\),则 \(x,y\) 连续
- 若 \(x>z\),则 \(x,z\) 连续
- 若 \(y>z\),则 \(x,y\) 连续
因此最终排列由若干段组成,每段第一个数最大,且长度为 \(1/2/3\)
显然每段第一个元素组成的序列单调递增(每次都找最小的取下去,一直到无法取,因此下一段开始一定比前一段大)
因此以上的段为极大的
显然长为 \(1\) 的不能少于长度为 \(2\) 的,因为一个 \(2\) 需要和一个 \(1\) 匹配为一块,而 \(1\) 自身可以三个组成一块
可证满足上述要求的序列可对应至少一个初始排列
问题转化为求长为 \(3n\),且由若干长为 \(1\sim 3\) 的连续段组成,满足段内第一个元素最大,且每段第一个元素递增,且长为 \(2\) 的不超过长为 \(1\) 的排列数量
考虑 \(dp\)
令 \(f_{i,j}\) 表示考虑长为 \(i\) 的前缀,长为 \(1\) 的数量减去长为 \(2\) 的数量为 \(j\) 的方案数,\(1\le i\le 3n\),\(-n\le j\le 3n\)
显然 \(f_{0,0}=1\)
转移则每次填一段
- 若段长为 \(1\),则其强制为最大值,\(f_{i,j}\gets f_{i-1,j-1}\)
- 若段长为 \(2\),则第一个数强制为最大值,后一个数任意,\(f_{i,j}\gets f_{i-2,j+1}(i-1)\)
- 若段长为 \(3\),则第一个数强制最大,后两个数任意,\(f_{i,j}\gets f_{i-3,j}(i-1)(i-2)\)
答案为 \(\sum_{j\ge 0} f_{3n,i}\)
时间复杂度 \(O(n^2)\),常数较大
空间可滚动数组(滚 \(4\) 个或 \(3\) 个)优化到 \(O(n)\)

浙公网安备 33010602011771号