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