2002: [Hnoi2010]Bounce 弹飞绵羊 - #include <Seter> - using namespace Orz;

2002: [Hnoi2010]Bounce 弹飞绵羊

Seter posted @ 2011年12月19日 17:10 in BZOJ with tags DTP HNOI LCT , 4498 阅读

http://www.zybbs.org/JudgeOnline/problem.php?id=2002

RunID User Problem Result Memory Time Language Code Length Submit Time
179464 Seter 2002 Accepted 6516 kb 704 ms C/Edit 1803 B 2011-12-19 12:46:33

终于写出LCT了……以前一直觉得LCT好难,现在发现原因是那时候我还没怎么用过splay。用SplayA掉一些题目以后再来看LCT,发现LCT实在是太简单了!从开始写(splay拷了自己的模板)到提交1A,总共才10+分钟!

然后开始无爱的刷Rank……不过失败了……ym7k+的122次提交……我不会告诉别人你是用O3的代码反汇编出来再交asm的 =。=

其实LCT的核心就是Access操作,即打通一个点到根的路径(且这条路径不能向下延伸),然后就可以处理这个点到某个祖先的路径上的询问了。具体操作就是实边和虚边的互相转化,杨哲等人的论文还是讲得很清楚的……这里不讲了。

如果是i,j两点间路径,那么需要求LCA。这时可以让access返回最后一次link操作时的父亲,那么access(i)后access(j)返回的就是LCA的指针了。

如果你不会Splay,那你最多只能大致了解LCT。如果你觉得你会Splay但是还没有A过题,那你想写LCT是非常困难的。想熟练快速并且悠闲地打出一个LCT模板,那么至少用SplayA掉2种(普通平衡树/代替线段树),每种2道不同类型的题目。

一般的LCT甚至不用Rank/Find等操作。比如这题只需要splay和Access两个操作即可!几乎不用花什么脑筋!

顺便牢骚一句,除了IO优化以外的任何刷RANK手段都是无耻的!!!

下面是些无关的话题:

1.我真心写不出LCT的模板啊……谁来告诉我除了Access还有啥操作?

2.今天数学课上突然弄懂了DC3(Skew)算法……太他妈神奇了,什么时候一定要去试试!

3.我觉得代码短看起来爽啊……我一开始不会LCT很可能和某些80行以上的超长代码有关……我会想,LCT这么长,我肯定学不会……

 

上面那个其实不是标准的LCT……又写了标准的……就是每个点只记录一个父亲的,然后一条链的splay中的根的父亲是这条链的最上面那个点的真实父亲。

这样弄了以后发现有点晕……两题调了我6小时,然后这题发现是有一句代码的执行顺序在本地和OJ上不同导致TLE……洞穴勘测那题发现是少了个pushdown……欲哭无泪啊……

洞穴勘测那题是好题,就是数据太委了,暴力就能过……

 

By Seter

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter
Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee