博客
关于我
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/

你可能感兴趣的文章
MySQL5.6忘记root密码(win平台)
查看>>
MySQL5.6的Linux安装shell脚本之二进制安装(一)
查看>>
MySQL5.6的zip包安装教程
查看>>
mysql5.7 for windows_MySQL 5.7 for Windows 解压缩版配置安装
查看>>
Webpack 基本环境搭建
查看>>
mysql5.7 安装版 表不能输入汉字解决方案
查看>>
MySQL5.7.18主从复制搭建(一主一从)
查看>>
MySQL5.7.19-win64安装启动
查看>>
mysql5.7.19安装图解_mysql5.7.19 winx64解压缩版安装配置教程
查看>>
MySQL5.7.37windows解压版的安装使用
查看>>
mysql5.7免费下载地址
查看>>
mysql5.7命令总结
查看>>
mysql5.7安装
查看>>
mysql5.7性能调优my.ini
查看>>
MySQL5.7新增Performance Schema表
查看>>
Mysql5.7深入学习 1.MySQL 5.7 中的新增功能
查看>>
Webpack 之 basic chunk graph
查看>>
Mysql5.7版本单机版my.cnf配置文件
查看>>
mysql5.7的安装和Navicat的安装
查看>>
mysql5.7示例数据库_Linux MySQL5.7多实例数据库配置
查看>>