2.27 比赛

2.27 比赛

A

据说有神秘做法。

算法一 (0pts)

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

算法二 (22pts)

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

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

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

55×0.4=22pts

算法三(40pts)

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

算法四(55pts)

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

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

算法五(100pts)

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

线段树优化建图

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

考虑如下题目:

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

操作 1:1 u v w,从 uv 连一条权值为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,即 dpi 表示前 i 个的答案。

易得转移式,dpi=mini1j=ik+1dpi+mex(j,i)×sum(j,i)

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

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

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

算法二

考虑值域小怎么做,我们把上面的式子转化一下,也就是 dpi=dpj+mex(i,j)×simex(i,j)×sj

然后我们枚举 mex 相同的段,也就是区间查询 fjsj×k 的最小值。这个东西可以用线段树维护,但是因为 k 不等,所以需要开 maxai 棵线段树。

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

算法三

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

注意到在上面的做法中,每个段的查询和 i 完全无关,因此对于整段,我们可以先算出对应 mexfjsj×k 的最大值 。

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

posted @   wtcqwq  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示