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

你可能感兴趣的文章
multiprocessing.Pool:map_async 和 imap 有什么区别?
查看>>
MySQL Connector/Net 句柄泄露
查看>>
multiprocessor(中)
查看>>
mysql CPU使用率过高的一次处理经历
查看>>
Multisim中555定时器使用技巧
查看>>
MySQL CRUD 数据表基础操作实战
查看>>
multisim变压器反馈式_穿过隔离栅供电:认识隔离式直流/ 直流偏置电源
查看>>
mysql csv import meets charset
查看>>
multivariate_normal TypeError: ufunc ‘add‘ output (typecode ‘O‘) could not be coerced to provided……
查看>>
MySQL DBA 数据库优化策略
查看>>
multi_index_container
查看>>
MySQL DBA 进阶知识详解
查看>>
Mura CMS processAsyncObject SQL注入漏洞复现(CVE-2024-32640)
查看>>
Mysql DBA 高级运维学习之路-DQL语句之select知识讲解
查看>>
mysql deadlock found when trying to get lock暴力解决
查看>>
MuseTalk如何生成高质量视频(使用技巧)
查看>>
mutiplemap 总结
查看>>
MySQL DELETE 表别名问题
查看>>
MySQL Error Handling in Stored Procedures---转载
查看>>
MVC 区域功能
查看>>