CF VP 记录

\(1.\) Codeforces Round #618 (Div. 2)
\(Rank\)\(1679\),赛时:\(ABC\),补题:\(D\)

\(2.\) Codeforces Round #619 (Div. 2)
\(Rank\)\(2422\),赛时:\(ABC\),补题:无

\(3.\) Educational Codeforces Round 82 (Rated for Div. 2)
\(Rank\)\(2151\),赛时:\(ABC\),补题:无

\(4.\) Codeforces Round #620 (Div. 2)
\(Rank\)\(677\),赛时:\(ABCF_1F_2\),补题:无

\(5.\) Educational Codeforces Round 83 (Rated for Div. 2)
\(Rank\)\(402\),赛时:\(ABCDE\),补题:无

\(6.\) Codeforces Round #622 (Div. 2)
\(Rank\)\(736\),赛时:\(ABC_1C_2\),补题:无

\(7.\) Codeforces Round #625 (Div. 2)
\(Rank\)\(209\),赛时:\(ABCD\),补题:\(EF\)

\(8.\) Codeforces Round #626 (Div. 2)
\(Rank\)\(709\),赛时:\(ABC\),补题:无

\(9.\) Codeforces Round #958 (Div. 2)
\(Rank\)\(56\),赛时:\(ABCDE\),补题:无
总结:难得打了一场好名次,简要说一下。
C证明:显然前两位必然有一个最高位为1,且此后最高位均为1,以此类推每次往下确定一个位,故至多 bitcount(n) + 1。构造是容易的。
D的dp本身是显然的,主要在于总次数的上界。由于一个点的t显然是其相邻t的mex,故想要让某个点的t达到T,就需要其相邻的点的t分别为1,2,...,T-1,设构造出T的点数为f(T),有:
f(T)=f(1)+f(2)+...+f(T-1)+1,显然这个式子是2^T量级的,故对于n,其T的上界是logn。
主要卡在以为上界为3,需要多根据数据范围与时限猜测做法,并加强反例构造的能力。
E是个我最爱的拆贡献算贡献题,先算出每个点的li与ri,正常计算出总答案ans。
对于每个点i的删除,首先去除其自身的贡献,然后减去跨越了i的区间的贡献(长度变短,用树状数组维护即可),最后对于lj=i或者rj=i再进行二分rmq找到新的lj'与rj'即可。
注意由于li与ri可以取到0与n+1,在多测清空的时候需要额外小心这两个点(吃了两罚)

\(9.\) Codeforces Round #960 (Div. 2)
\(Rank\)\(119\),赛时:\(ABCD\),补题:\(E1E2\)
总结:发挥比较不错,但是E1又是赛后几分钟过题。
E1是个比较神奇的题,我的总查询次数是2k + 5000/k,大概思路就是先枚举子树深度=k的点,如果返回0就删除整个子树,这样一次至少删除了k个点,最多进行5000/k次。
假如某次返回了1,那么说明mole在一个子树深度=k的子树中,此时随便找一个叶子节点,查询一次该点再查询一次叶子节点,当查询该点返回0时,mole就在该点的父亲的父亲处。
当然这样对于1无效,因此我们在查询1时,直接查询若干次然后返回1即可。
E2基于此优化,注意到每次查询一次叶子节点再查询一次该点过于繁琐,我们直接查询k次叶子节点。此时mole一定位于当前点及以上,故其位置在一条链上。
直接对此链进行二分,只需要logn次就能得到答案。
故此时总查询次数是k+5000/k+log2(5000),在k=70时查询154次,可以通过此题。
E2代码

posted @ 2022-01-23 10:40  David24  阅读(85)  评论(0)    收藏  举报