ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

VP - Codeforces Round 722 Div.2

2021-06-26 21:35:12  阅读:206  来源: 互联网

标签:删除 祖先 ed 线段 st VP 722 Div.2 配对


这场比赛我只打了一个小时,赛时通过 \(\text{A,B,C}\),排名 \(880\)(算上 Unofficial)。

A

略。

B

略。

C

显然让每个点的数都取它的边界是最优的,然后 dp 即可。

D

考虑点 \(1\) 的配对,设其与 \(x\) 构成一条线段。

设 \(f_i\) 为 \(2i\) 个点自由配对的方案数。

  • 若 \(x\le n\):因为从 \(1\) 开始的线段不可能被其它线段覆盖,所以 \(1\sim 2n\) 一定铺满了长度为 \((x-1)\) 的线段。因为要恰好铺满,所以方案数为 \(\sigma_0(n)\)。
  • 若 \(x>n\):此时 \(x\sim 2n\) 这些点一定会与 \(1\sim (2n-x+1)\) 这些点对应地配对。因此还有 \(2(x-n-1)\) 个点可以随意配对,方案数即为 \(\sum_{i=1}^{n-1} f_i\)。

E

设 Soroush 的树是 \(S\),Keshi 的树是 \(T\)。

首先,最大团中的点一定都在 \(S\) 中从 \(1\) 到某个叶子节点的路径上。并且可以发现,在路径确定时,最优的方案是优先选在 \(T\) 中深度较浅的点。

也就是说,我们要有一种算法,支持如下操作:

  • 加入一个点;
  • 删除一个点,且这个点被删除之前,其在 \(S\) 中的所有子孙都被删除了;
  • 询问目前点集中最多能取出多少个点,使得它们在 \(T\) 中两两无祖先关系。

设操作三的点集是 \(P\),那么对于操作一,设加入了点 \(u\),假如 \(u\) 是 \(P\) 中某个点的祖先,那么在 \(P\) 中加入 \(u\) 显然不优;否则将 \(P\) 中 \(u\) 的祖先删除并加入 \(u\)。

如何查询 \(P\) 中是否有 \(u\) 的祖先?考虑预处理 \(T\) 的欧拉序,记为 \((st_u,ed_u)\),并维护 \(P\) 中所有点的从小到大排序的 \(st\)。因为要查的是 \(u\) 的祖先(记为 \(x\)),所以一定有 \(st_x\le st_u\land ed_x\ge ed_u\)。找到 \(P\) 中最后一个满足 \(st_x\le st_u\) 的 \(x\),可以证明,如果 \(P\) 中存在 \(u\) 的祖先,那么它一定是 \(x\)。

证明

假如 \(P\) 中存在某个点 \(v(v\neq x)\) 使得 \(v\) 是 \(u\) 的祖先,那么有 \(st_v<st_x\)。讨论 \(x\) 的两种可能:

  • 如果 \(x\) 是 \(u\) 的祖先,那么显然得证;
  • 如果 \(x\) 不是 \(u\) 的祖先,那么有 \(ed_x<ed_u\)。因为 \(v\) 是 \(u\) 的祖先,所以 \(st_v<st_x\land ed_v>ed_x\),即 \(v\) 也是 \(x\) 的祖先,与 \(P\) 的定义矛盾。

查询 \(u\) 是否是 \(P\) 中某个点的祖先同理。

对于删除操作,每次添加操作修改的点个数是 \(O(1)\) 的,因此在 \(S\) 中每个点上记录修改即可。

标签:删除,祖先,ed,线段,st,VP,722,Div.2,配对
来源: https://www.cnblogs.com/alan-zhao-2007/p/vp-cf-722-div2.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有