博客
关于我
20161109模拟赛解题报告
阅读量:798 次
发布时间:2023-04-16

本文共 825 字,大约阅读时间需要 2 分钟。

解题报告:100分解题思路

T1:模拟即可

我之前一直担心极限数据的大小,5000(n,m)*100000(k),用二维数组存储的话,空间基本上勉强可以撑住,但时间上可能就不够用了。所以我开始思考能不能用更高效的存储方式。

于是,我决定用两个一位数组分别表示行和列。这样,每次修改操作的时间复杂度就降到了O(1)。而查询操作虽然看起来复杂度是O(nm),但实际上只需要查询一次,因为数据结构的特性决定了只需要一次查询就可以得到结果。

总体来说,这种方法的时间复杂度是O(nmk),虽然看起来有点高,但因为每次查询只需要一次,所以实际运行效率还是可以接受的。

T2:搜索

一开始,我想的方向有点偏差,后来我意识到应该从结果倒推。也就是说,从“a”这个结果出发,逆推可能的答案序列。这在小样例中是可行的,但当数据量变大时,方法就不太奏效了。

于是,我开始另辟蹊径。观察到数据范围很小,我决定直接枚举所有可能的答案序列。对于每一个序列,我会检查它是否可以通过某种脱水缩合的过程变成“a”。如果可以,那么这个序列就是合法的答案;否则,就不是。

这种方法的时间复杂度大约是6的排列,也就是30-50万级别的样子。加上检验的操作,总体复杂度还是在O(100W)以内,这样的效率对于当前的数据量来说是可以接受的。

T3:线段树

一开始,我也考虑过使用线段树来解决这个问题。但在具体实现的时候,我不知道该怎么维护数据结构。后来,我决定放弃线段树,改用暴力方法来解决。

对于一个给定的式子,比如f2[f[1]]=k2(k1+b1)+b2=(k1k2)+(k2b1+b2),我发现它非常适合用线段树来处理。叶子节点直接存储ki和bi,这是很直观的。然后,每个内部节点的k和b都可以通过其子节点的k和b计算得到。最后,我只需要套用标准的线段树模板,并不需要懒惰标记,就可以实现了。

这种方法的时间复杂度是O(nlogn + mlogn),在数据量不大的情况下,效率非常高。

转载地址:http://yjgfk.baihongyu.com/

你可能感兴趣的文章
MySQL 存储引擎
查看>>
mysql 存储过程 注入_mysql 视图 事务 存储过程 SQL注入
查看>>
MySQL 存储过程参数:in、out、inout
查看>>
mysql 存储过程每隔一段时间执行一次
查看>>
mysql 存在update不存在insert
查看>>
Mysql 学习总结(86)—— Mysql 的 JSON 数据类型正确使用姿势
查看>>
Mysql 学习总结(87)—— Mysql 执行计划(Explain)再总结
查看>>
Mysql 学习总结(88)—— Mysql 官方为什么不推荐用雪花 id 和 uuid 做 MySQL 主键
查看>>
Mysql 学习总结(89)—— Mysql 库表容量统计
查看>>
mysql 实现主从复制/主从同步
查看>>
mysql 审核_审核MySQL数据库上的登录
查看>>
mysql 导入 sql 文件时 ERROR 1046 (3D000) no database selected 错误的解决
查看>>
mysql 导入导出大文件
查看>>
MySQL 导出数据
查看>>
mysql 将null转代为0
查看>>
mysql 常用
查看>>
MySQL 常用列类型
查看>>
mysql 常用命令
查看>>
Mysql 常见ALTER TABLE操作
查看>>
MySQL 常见的 9 种优化方法
查看>>