noi2006解题报告.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
noi2006解题报告

Day1: #1:网络收费 (network) 这道题完全不会,当时写了个搜索拿了40分 ? 把配对收费规则转化一下,对于任两个用户i,j,设它们的最近公共祖先(LCA)是p 如果在p上nanb,则i,j中谁是A谁支付F[i,j]的费用 如果在p上na≥nb,则i,j中谁是B谁支付F[i,j]的费用 这样的转化让点对交费转移到单点交费,为dp提供了前提,且最后的总费用不变 ? 整个模型是一棵完全二叉树,设计树形dp dp[i,j,k]:在点i所管辖的所有用户中,有j个用户为A 在i的每个祖先u上,如果nanb,则标0,否则标1,这个数列可以用二进制表示,用k记录 在这种情况下的最少花费 ? 状态转移方程:其实就是将j个用户分配给i的左右子节点,并更改k dp[i,j,k]=min{dp[i.lt,u,k+%s],dp[i.rt,j-u,k+%s]} +%s表示在数列上加入节点i的标号,i.lt、i.rt分别表示i的左右子节点 ? 边界:当i是叶节点时,可以根据k算出i与其它用户配对收费时所要交的费用,再根据i的初始情况加上AB的转化费用 ? 复杂度分析:设m=2n粗略看来,空间复杂度是O(m3),时间复杂度是O(m4),对于本题的数据可以同时MLE和TLE了 如果你看到这样复杂度就想别的方法了,那我只能同情你了,因为这只是很粗略的复杂度分析 ? 把根节点看做第0层,叶节点就是第n层,对于任意的第i层,A用户的个数最多只有2n-i,而祖先结点只有i个,即k最大只有2i 把dp[i,j,k]的后两维合并成一维,空间复杂度其实只有O(m2) 再看时间复杂度,对于第i层,有2i个节点,每个节点的状态数是O(m)的,状态转移的复杂度是O(2n-i),所以每层的复杂度是O(m2) 总共有n层,所以状态转移的时间复杂度是O(m2n) 考虑边界,如果是朴素的计算费用,即枚举所有用户(O(m)),再算出LCA(O(n)),复杂度是O(mn) 边界数高达O(m2),这样计算边界的复杂度就是O(m3n)! 加一些预处理,提前算出所有点的LCA,复杂度是O(m2n) 设dpx[i,j]表示第i个用户,在向上数第j个祖先节点处配对收费时所要交的费用,dpx可以在O(m2n)的时间内计算出来 计算每个边界时可以根据k在O(n)时间内计算出配对费用, 这样计算边界的复杂度降到O(m2n) ? 至此空间复杂度和时间复杂度都降到了可以承受的地步,在具体实现时,要用记忆化搜索和二进制的位运算 ps.说了一大堆,感觉不如直接看我的程序 ? ? ? #2:生日快乐 (happybirthday) 这次NOI唯一一道做得比较满意的题目,算法和标准算法完全一样,得分90 ? 数据结构就是二叉树,为了使之平衡,这里用treap(当然也可以用splay,不过好像treap比splay快一些) 为了记录每个元素排序后的位置,每个节点加num记录该节点为根的子树上的节点总数 每次收到一个礼物,将它插入到treap中,根据num可以得到它的位置pl 然后根据男生或女生得到要吃掉的礼物的位置(pl±L),根据num确定该节点s 如果s不存在或者没有果冻,那么tell(-1) 否则将s从treap中删除(先把s移到叶节点,然后删除),改变s的果冻数,然后重新插入到treap中 注意在操作中更改num的值 时间复杂度是O(nlogn) ps.重新编了一下,最后一个数据仍然TLE,大概我的treap写垃圾了- -b ? ? ? #3:千年虫 (worm) 用一个小时看出来是用dp,用一个小时优化方程,交上去以后才发现:方程写错了 后来听人说这道题和HNOI的某道题一样,抓狂,后悔没做省选题…… ? 如果你语文够强,在分析完题目的描述以后应该可以得到这样的结论: 以一边为例,则千年虫的外形是一个类似梳子的样子(事实上,HNOI那道题好像就是叫梳子),就是一段高,一段低 而我们要做的,就是添加尽量少的方块,使得外形满足上诉的样子,这样很容易想到dp 设dp[i,j,s]表示前i行,第i行的状态是s(s=0,第i行处于凹的一段;s=1,第i行处于凸的一段),且第i行的最终高度是j的状态下最小添加的方块数 dp[i,j,s]=min{dp[i-1,j,s],dp[i-1,k,1-s](s=1,kj s=0,kj)}+(j-h[i]),其中h[i]是第i行的原始高度 时间复杂度是O(n3)的,根据状态转移方程可以把复杂度降到O(n2) ? 但是对于本题的极限数据,这样的复杂度仍然不能令人满意 bamboo的BT方法:其实就是减少需要计算的状态量,我将其理解为建立在贪心基础上的dp 对于第i行,设它的初始高度为a[i],最终高度为b[i] 能够证明的是:b[i]的取值范围只能是[a[j],a[j]+

文档评论(0)

561190791 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档