NOI模拟赛 4.29
赛时时间安排
读题
7:45-8:10:换了套题,重新开始读题,感觉比昨天更难了???
T1
8:10-9:10:T1的60pts(前三档)部分分比较简单,且主体算法可以一起处理,开始码,但由于对于Linux的调试还是不太熟悉,打+拍完几档分的耗时还是比预想的要长。
T2
9:10-9:35:码完T2的30pts搜索分,短暂地想了一下60pts,觉得似乎可做,先跳
T3
9:35-9:55:码完T3的10pts
9:55-10:05:想了T3的20pts的线段树二分做法,但觉得不一定能调出来,且期望得分不如回去想T2高,就回去想T2了
T2
10:05-10:25:码了一个计数DP,但都计数完后发现不会将各个位置的答案合起来计算总方案数,自闭了
10:25-10:45:从容斥的角度重新考虑T2,但感觉怎么算都做不到不重不漏,自闭了
持续自闭
10:45-11:05:发现情况不妙,但此时在留出大约10min去检查的前提下剩余时间已经不足以去码T3的20pts,只能翻回去想T1,想从计数贡献的角度重新考虑问题,但发现还是做不到不重不漏,自闭了
11:05-11:25:放弃挣扎,开始检查
11:25-12:00:老师进来说延长30min,从11:00开始一个小时或许能打完T3的20pts,可现在根本打不完啊,持续自闭
赛后反思
关于T3的20pts
赛场上没有选择打的原因是这道题的线段树二分做法所要记录的信息较多,自己没有信心在短时间内调出,且综合分值考量,扔下了这20pts,没想到相比其它貌似好打一些的分数来说,这20pts才是最好打的。
暴露出的问题:1.赛场上应该优先选择有明确算法的部分分先打 2.线段树的题还是要多练、常练,打好基本功
关于T1的正解
虽然T1的这种拓扑排序方式在以前的题目中没有见过,但证明正解复杂度需要用到的证明方法却是以前在无向图三元环计数
问题中见过的,图论问题要多发散地去想问题
线段树上二分总结
普通的线段树每次依据位置信息来决定进入左区间还是右区间,如果我们要在线段树上二分,则是根据当前线段树节点所记录的某项信息来决定进入左区间还是右区间,这种做法可以比线段树+二分少一个log的复杂度。
朴素的线段树二分问题:PA2015\Siano
发现每次生长最快的草一定最高,因此可以把草按生长速度排序使得草的高度具有可二分性,然后依据当前节点最高的草的高度进行线段树上二分即可。
inline int find(int x,int l,int r,ll k){
if(l==r)return sum(x)<k?n+1:l;
down(x,l,r);
int mid=(l+r)>>1;
if(mx(lch)>=k)return find(lch,l,mid,k);
else return find(rch,mid+1,r,k);
}
线段树二分+线段树划分区间(类倍增思想):[SHOI2015]脑洞治疗仪
这道理的两个log做法(线段树+二分)的做法较好想,考虑如何优化成线段树上二分,这道题如果想要二分的话需要依据多个节点的信息,无法通过预处理得出,我们可以借鉴树状数组+倍增的思想,用一次单log的线段树操作将涉及到的区间划分成log个单独区间,对于前面的区间O(1)update,对于最后一个区间进行单log的线段树上二分
值域线段树上二分:CF1083C Max Mex
待更
其它:[九省联考2018day1]T2 IIIDX
待更