2.27 比赛

2.27 比赛

A

据说有神秘做法。

算法一 (0pts)

暴力枚举哪些点传播哪些点不传播。时间复杂度 \(O(2^n\times n)\)。期望得分 \(0\) 分。

算法二 (22pts)

我们发现这里的图论模型,如果 \(i\) 可以传播到 \(j\),则我们认为存在一条 \(i\to j\) 的单向边。问题转化为 标记最少/最多个点,使得每个点有且仅有一个标记点可以走向它。

显然,最多个点的答案是 SCC 的个数。

所以我们可以暴力建边 tarjan 求解。考虑到 \(x_i\) 两两不同,所以从点 \(i\) 连出去的边至多有 \(\min{\{n,2d_i\}}\) 条。所以在 \(n\le 1000\) 和特殊性质 B 下可以得分。时间复杂度 \(\mathcal O(n^2)\)

\(55\times 0.4=22pts\)

算法三(40pts)

上面那个东西你写的优美一点就可以得到 \(100\times 0.4=40pts\),因为数据比较弱。

算法四(55pts)

考虑第一问怎么做。手玩样例和小数据后发现:没有入度的强连通分量个数。

暴力建边,维护每一个 SCC 所含的点,这很好做。时间复杂度 \(\mathcal O(n^2)\)。细节比较多。经过一些剪枝,优秀的写法可以得到 \(70pts\) 左右。

算法五(100pts)

考虑你在图上建边一定是一段区间,这符合线段树建图的特征。把上述过程用线段树建图优化即可。

线段树优化建图

线段树优化建图就是利用两棵线段树,减少连边数量,达到降低复杂度的目的。

考虑如下题目:

有n个点,q个询问,每次询问给出一个操作。

操作 \(1\):1 u v w,从 \(u\)\(v\) 连一条权值为w的有向边

操作 \(2\):2 u l r w,从 \(u\) 向区间 \([l,r]\) 的所有点连一条权值为w的有向边

操作 \(3\):3 u l r w,从区间 \([l,r]\) 的所有点连一条权值为w的有向边

首先,我们发现难点在连边,因为连完边后跑一遍最短路就好了。

我们考虑用两棵线段树来搞,建两棵线段树,一棵处理入边,一棵处理出边。

方便起见,我们下文称其为入树和出树。

开始我们让父亲和儿子连边,然后我们再让入树和出树的叶子节点之间连上边权为 \(0\) 的边。

据说很难写。

B

这数据/qd

好像是 pjudge 前几天原题 /jy。

算法一

考虑朴素 dp,即 \(dp_i\) 表示前 \(i\) 个的答案。

易得转移式,\(dp_i=\min_{i-1}^{j=i-k+1} dp_i+\text{mex}(j,i)\times \text{sum} (j,i)\)

前者我们增量式修改动态维护一个 vis 数组即可,均摊下来复杂度对于一个 \(i\) 必然是 \(\mathcal O(n)\) 级别的。

后者可以用前缀和在预处理 \(\mathcal O(n)\),查询 \(\mathcal O(1)\) 的时间复杂度得到。

所以这个 dp 就很好写了。时间复杂度 \(\mathcal O(n(n+k))\) ,考虑到 \(n\) 比较大,所以可能可以考虑用 bitset 代替 bool 数组在常数上获得少量优化。期望得分 30 pts。然后如果你用 bitset 的话,出题人的数据造的及其不优秀,实际上可以获得 60pts,因为这样的时间复杂度是 \(\mathcal O(n(\frac n w+k))\) 的,实际上挺小。

算法二

考虑值域小怎么做,我们把上面的式子转化一下,也就是 \(dp_i=dp_j+\text{mex}(i,j)\times s_i-\text{mex}(i,j)\times s_j\)

然后我们枚举 mex 相同的段,也就是区间查询 \(f_j-s_j\times k\) 的最小值。这个东西可以用线段树维护,但是因为 \(k\) 不等,所以需要开 \(\max a_i\) 棵线段树。

时间复杂度 \(\mathcal O(An\log n)\) 的如果你真的只做了 \(A\le 10\),显然太唐了。考虑做 \(A\le 50\) 的情况,在随机数据下 mex 的确不会查过 50,所以在比赛初期过了,现在好像被卡到 75 了/ll。

算法三

如果我们遍历所有本质不同的段(或者不同的 mex),时间复杂度都会退化到 \(\mathcal O(n^2)\),我们考虑接下来怎么做。

注意到在上面的做法中,每个段的查询和 \(i\) 完全无关,因此对于整段,我们可以先算出对应 \(\text{mex}\)\(f_j-s_j\times k\) 的最大值 。

那么查询相当于求区间 \(s_i\times \text{mex}+v\) 的最大值,同样可以用线段树套李超线段树维护。不是整段的部分最多只有一段,按照刚才的做法查询就行了。总时间复杂度是 \(\mathcal O(n\log^2n)\),挺难写。

posted @ 2024-02-29 15:01  wtcqwq  阅读(27)  评论(0)    收藏  举报