Silent Answer
D1T1 集合
注意到:两个集合序列等价当且仅当每个元素的出现位置集合所构成的可重集相等 .
双指针后只需要维护加或删元素后判断,可以使用 Hash 简单完成 .
时间复杂度 \(\Theta(n+q)\) .
D1T2 百万富翁
第一档不说了 .
考虑一下第二档,每轮假设序列长度为 \(n\),可以考虑分 \(k\) 段每段取最大值划分为子问题,每段内部用第一档的做法暴力问出来所有大小关系 . 那么可以用 \(\frac nk\cdot\frac{k(k-1)}2\) 次操作把 \(n\) 除以 \(k\),具体余数的部分可能有一些小扰动 .
因为 \(n\) 实际上是固定的所以可以直接本机 DP 一下找到每轮最优的 \(k\),这样问题就解决了 . 需要得到最优解才能通过(
D1T3 树的定向
首先特殊性质 A 就是黑白染色,注意到合法方案只可能是全从黑连到白或者从白连到黑,钦定第一条边的方向为 0 即可 .
对于一般情况考虑字典序就是扫一遍每条边贪心,先考虑怎么做确定若干条边后判断是否存在合法方案 . 可以按照下面的流程做:
- 如果存在一个点对不满足条件,那么不存在合法方案 .
- 如果存在一个点对间的路径有至少一条反向边,那么删掉对应点对 .
- 如果存在一个点对间恰有一条边未被定向,定为反向然后删掉点对 .
进行上述流程直到无法进行,然后缩点即可转为特殊性质 A 的问题 . 这样就 \(O(n^2m)\) 了 .
可以把枚举边贪心的过程和判断是否存在合法方案的过程合起来,具体地:
- 如果存在一个点对间的路径有至少一条反向边,那么删掉对应点对 .
- 如果存在一个点对间恰有一条边未被定向,定为反向然后删掉点对 .
- 如果没有可以删的点对,那么定向第一条未被定向的边为 0 .
朴素实现上面的过程是 \(O(nm)\) 的,可以用数据结构优化到 \(O((n+m)\log n)\) .
D2T1 分数
注意到想生成所有完美正分数只需要从 \(\frac12\) 开始每次加 2 或者取倒数 .
根据对称性只需要考虑 \(<1\) 的分数,那么每个分数都可以表示为连分数 \(\frac{1}{a_1+\frac{1}{a_2+\frac{1}{a_3+\frac1{\ddots}}}}\),其中每个 \(a_i\) 都是偶数 .
令 \(x=\max\{a_i\}\) 则答案可以表示为 \(\dfrac{ax+b}{cx+d}\),注意到此时知道 \((a,b,c,d)\) 和 \(x\) 的下界即可快速计算可能的 \(x\) 的个数 . 此时可以直接暴搜:先搜出来一个完美正分数,然后加入 \(x\) 后继续搜,需要动态维护当前 \(x\) 能取的最小值,同时当没有可能的 \(x\) 之后直接跳出 .
这样就可以过了 . 复杂度不会证
D2T2 登山
考虑 DP,每次转移一步(落下来然后冲上去)的过程 . 令 \(l_i,r_i\) 是 \(i\) 能冲刺到的位置区间,\(t_i=d_i-h_i+1\),\(w(u,v)\) 是路径 \(u-v\) 上 \(t\) 的最小值,则从 \(i\) 滑到子树内的某个结点 \(j\) 然后冲到其祖先 \(k\) 的过程合法当且仅当 \(d_k\in[l_j,\min\{r_j,w(i,j)\}]\) .
枚举 \(j\) 考虑每个 \(i\) 的贡献 . 把区间 \([l_j,\min\{r_j,w(i,j)\}]\) 拆成两段前缀的差分 \([0,\min\{r_j,w(i,j)\}]-[0,l_j)\),求出一个位置 \([0,x]\) 的答案后考察 \(l_j-1=x\) 或者 \(\min\{r_j,w(i,j)\}=x\) 的 \(j\) .
对于前者注意到 \(i\) 是祖先链的一个前缀可以倍增出来之后链加,对于后者考虑一定是先取一些 \(r_j\) 然后取到某个 \(t_u=w(i,j)\),令 \(u\) 是满足条件的点中深度最大的 . 此时枚举 \(u\) 后 \(i,j\) 独立,可以计算满足条件的 \(j\) 的数量之后对 \(i\) 链加完成 .
时间复杂度 \(\Theta(n\log n)\) .
D2T3 树形图
做不了,别想了 .
以下是博客签名,正文无关
本文来自博客园,作者:Jijidawang,转载请注明原文链接:https://www.cnblogs.com/CDOI-24374/p/18344014
版权声明:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0)进行许可。看完如果觉得有用请点个赞吧 QwQ