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代码
\(10.\) Codeforces Round #992 (Div. 2)
\(Rank\):\(172\),赛时:\(ABCDE\),补题:\(F\)
总结:D想了一辈子才过,E反而快一些。
E题直接算一下期望然后加起来就是答案,用p费用就直接删掉代价最大的几个点就行。其实可以做到O(nlogn+qlogn)。
F题考虑Burnside引理,\(ans = \dfrac{1}{abc}\sum \text{fix}(x)\),其中fix(x)表示在x操作下不变的染色方案。
考虑计算fix(x)。假设一次操作x重复L次后首次回到自己,那么实际上将abc个位置划分为abc/L个大小为L的环,要求每个环内的颜色都相等。
那么把di分别分配给这些环,要求L是gcd(d1, d2, ..., dn)的因子。
\(\text{fix}(x) = \dfrac{(abc/L)!}{\prod (d_i/L)!}\)
容易发现,fix(x)事实上只与L有关,那么 \(ans = \dfrac{1}{abc}\sum_{L | g} \limits cnt_L \dfrac{(abc/L)!}{\prod (d_i/L)!}\)。
考虑如何计算cntL。
对于一个变换x(t1,t2,t3),实际上就是要求Lt1为a倍数,Lt2为b倍数,Lt3为c倍数。
固定了L之后,容易发现这样的t1有gcd(a,L)个,剩余两维同理。
但是我们的L同时还需要是x对应的最小L,因此数重了。
由于gcd(a,L)gcd(b,L)gcd(c,L)实际上对应的是所有重复L次之后能回到自己的操作,我们减去重复L'次之后首次回到自己的操作得到的就是L次后首次回到自己的操作,其中L'为L的因子。
因此cntL=gcd(a,L)gcd(b,L)gcd(c,L)-sum(cntL')。
对于每次查询,我们直接枚举L暴力计算cntL,然后代入上式计算ans即可。
复杂度 \(\text{O}(abc+T(\sigma^2(abc) + \sigma(abc)k))\)
\(11.\) Codeforces Round #633 (Div. 1)
\(Rank\):\(295\),赛时:\(ABC\),补题:暂无
总结:C写的较慢。
\(12.\) Codeforces Round #994 (Div. 2)
\(Rank\):\(62\),赛时:\(ABCDE\),补题:\(F\)
总结:D写的较慢,E细节没想好
D直接扫一遍就能不带log。
E写了个麻烦的做法,查询次数有点多。
F题首先转化为求最长的子区间使得其包含且仅包含[0,\(2^k\)-1],这等价于找到值域在[0,\(2^k\)-1]中的极长段,并维护其中颜色数。
然后倒过来让每个数减去一个数,这样就只会凭空加进来数,然后合并相邻区间。
启发式合并map即可。貌似有些小细节。
复杂度 \(\text{O}(n\log^3 n)\)。
\(13.\) Codeforces Round #635 (Div. 1)
\(Rank\):\(903\),赛时:\(AB\),补题:\(C\)
总结:最没有人样的一集,想了一年不会区间dp。
补题?一个3200一个2700。
\(14.\) Codeforces Round #637 (Div. 1)
\(Rank\):\(340\),赛时:\(ABC\),补题:暂无
总结:打的其实不赖,但是C想了太久了,尤其是中间最短路写了一年01bfs不知道是何意味。
\(15.\) Codeforces Round #996 (Div. 2)
\(Rank\):\(590\),赛时:\(ABCD\),补题:暂无
总结:纯粹的智障,不知道Sn=Sm能推出S=0。
\(16.\) Educational Codeforces Round 172 (Rated for Div. 2)
\(Rank\):\(17\),赛时:\(ABCDE\),补题:暂无
总结:纯牛逼,把E这个2900场切了。
E首先容易转化成从大到小考虑每个点是否要删,关键在于判断当前点是否能删除,以及维护删除后的连通块。
假设当前考虑i,且ai=aj,显然若删除i,j必须在剩下的连通块中,有两种情况:j在i子树中,j在i子树外。
接着就是判断每种情况下目标连通块是否仍然有1-n所有数。
对于第一种情况,相当于查询i对应j所在的儿子子树中颜色数是否为n;对于第二种情况,相当于查询i子树内是否没有彻底包含当前的某个颜色。
于是我们考虑维护两个值:当前连通块中,每个点子树中的颜色数与其子树中完全包含的颜色数(即有多少个颜色只在该子树中出现)
这两个值的初始化为:对于一个颜色的两次出现x与y,颜色数贡献:x到根+1,y到根+1,lca(x,y)到根-1;完全包含的颜色数贡献:lca(x,y)到根+1。
在第一种情况下,我们需要删除除了那个儿子子树外的其余所有点。显然删除这些点不会影响到儿子子树中的颜色数,只会影响完全包含的颜色数。
设我们遍历到的要删除的点x对应颜色的另一次出现为y,那么lca(x,y)到根-1,y到根+1即可。
在第二种情况下,我们需要删除i的子树,此时完全包含的颜色数的影响同上。
考虑对颜色数的贡献,设我们遍历到的要删除的点x对应颜色的另一次出现为y,那么x到根-1,lca(x,y)到根+1即可。
问题转化为点到根+1,查询点的值,直接差分到dfs序上然后bit即可。
复杂度O(nlogn)
\(17.\) Educational Codeforces Round 173 (Rated for Div. 2)
\(Rank\):\(75\),赛时:\(ABCDE\),补题:\(F\)
总结:手速太慢,F傻逼题没写出来。
F考虑区间长度太长时,根据鸽巢原理答案一定是1或者2,直接前缀和一下然后算C(cnt, 2)之和就行了。
区间小于等于50时,直接dp:f[i][j]表示前i个数,保证至少选了一个数的情况下,异或为j的最小选择个数,然后g[i][j]记录f对应的方案数即可。
G是[Ynoi2010] Brodal queue的弱化版,改天把这题补了。
(其实打这场是因为这场的E是个2300,板刷一半发现这场就顺手vp了)
\(18.\) Codeforces Round 997 (Div. 2)
\(Rank\):\(155\),赛时:\(ABCD\),补题:\(E\)
总结:纯傻逼,B题卡一万年。
E考虑每个区间一定是恰好两个儿子,构成的就是一棵完全二叉树。
n个叶子节点的完全二叉树共\(C(n - 1)\)种,C为卡特兰数。
于是先补出根节点与所有叶子节点,并用栈建出已有区间的树形结构,那么考虑一个有k个儿子的区间,它的子树方案数就是\(C(k-1)\),全乘起来就行了

浙公网安备 33010602011771号