- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Noip2005 普及组解题报告by Nothing
Pre-read
如果对本文中“略”的内容有任何不明白,建议阅读前先看看/bbs里面的解题报告。在这里向原作者致敬。
本文的主要目的是介绍tree和circle的解法。
Noip2005 普及组解题报告
By Nothing in青岛
Mail:yuye-abc@163.com
QQ:368314116
apple.pas/c/cpp/
O(1),略
tree.pas/c/cpp
通常的做法是:
算法1:用array[1..10000] of Boolean记录下来每一棵树的状态,然后统计true元素的个数。这种算法的时间复杂度是O(LM+M)=O(LM)对于本题的数据范围是足够的。
但是,如果我们把M的范围扩大到10^6,上述算法是显然不行的,这时我们需要如下的算法
算法2:每一次拔树,只记录下最前面和最后面的树。最后再统一拔去。说得详细一点就是如下表,L=15,M=4,我们要把第2~9,4~11,5~6,13~15拔去,从上往下每一行代表拔去一个区域的树
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ( ) ( ( ) ) ( ( ( ) ) ) ( ( ( ) ) ) ( )
我们用括号代表要拔去的树的开始和结束。
下面我们设立计数器k,从左向右看,看到一个左括号就inc(k),看到了右括号就dec(k)。
号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 状态 ( ( ( ) ) ) ( ) k 0 1 1 2 3 2 2 2 1 1 0 0 1 1 0 这样我们就得到了一个时间复杂度为O(M+L)的算法。
具体实现的时候,有一些细节需要注意,比如分别要将1..3,3..5的树木拔去,那么3的位置放置一个左括号还是右括号呢?我们可以看到,这两个区域如果合并了,3的左括号和右括号恰好抵消(相当于去除了一个长度为0的重合区域)。下面给出伪代码。
读入l,m
清空数组trees: array[1..L] as integer
For i:=1 to m do begin
读入st,ed
Inc(trees[st]); dec(trees[ed]);
End;
K:=0; answer:=0;
For i:=1 to l do begin
If trees[i]0 then k:=k+trees[i];
If k0 then inc(answer);
If trees[i]0 then k:=k+trees[i]
End;
输出answer
下面我们再来对这个算法进行优化。假设L的范围是maxlongint。我们可以发现,实际上对answer启作用的只有trees数组中非0元素。在算法2中,处理非0元素的时间只有O(m),但是第二次循环却用了O(L),所以我们可以得出一个更快一点的算法,这个算法类似于离散化的色块统计。它的复杂度为O(mlog2m+4m)=O(mlog2m)。伪代码如下。
算法3:
读入l,m
清空数组trees[1..m+m] of record add,type:integer end; //.add:该树的位置,.type:该树的类型(开始或者结束)
For i:=1 to m do begin
读入st,ed
Trees[i+i-1].add:=st; trees[i+i-1].type:=1;
Trees[i+i].add:=ed; trees[i+i-1].type:=-1;
End;
对trees按照.add记录排序(Qsort即可)
Answer:=0; k:=0;
对trees按照.add记录进行调整,具体目的是去除重复的记录,如果连续2个.add记录相同并且.type不同,那么这2个记录都要从tree中移出,如果.type相同,那么保留任意一个,并且把剩下的那个位置记为2个相同的括号。具体从数组中移出元素可以进行标记(.type=0)
For i:=1 to m+m do begin
If k=1 then
If trees[i].type 〉0 then begin inc(k, trees[i].type); trees[i].type:=0; end
Else If trees[i].type0 then inc(k, trees[i].type);
if k=0 then
if trees[i].type0 then inc(k, trees[i].type);
if k1 then begin
if trees[i].type1 then begin inc(k, trees[i].typ
您可能关注的文档
最近下载
- 中国国家标准 GB 4806.11-2023食品安全国家标准 食品接触用橡胶材料及制品.pdf
- 2025-2026学年小学信息技术清华版2012六年级上册-清华版(2012)教学设计合集.docx
- 光伏电站检测规范.docx VIP
- 监理实施细则(装饰装修工程).docx
- 《古建筑油漆彩画作》课件——绪论 古建筑彩画概论.pptx VIP
- 《古建筑油漆彩画作》课件——中国建筑彩画产生及发展简况.pptx VIP
- 心脏介入治疗流程图解.pptx VIP
- 《古建筑油漆彩画作》课件——第四章 清代建筑彩画.pptx VIP
- 《蝙蝠侠:黑暗骑士》完整中英文对照剧本.docx VIP
- 《古建筑油漆彩画作》课件——第五章 晋系地方建筑彩画.pptx VIP
文档评论(0)