2020集训队作业板刷记录(五)

由于时间不够了,所以这一篇里全都是口胡,代码没写过

ARC101F

传送门

不会

先去掉\(1\)出口左边的和\(m\)出口右边的,设剩下每个点到左边最近的出口和右边最近的出口距离分别为\(x,y\),那么我们将其看做\((x,y)\)左下角那一个格子,那么一个合法的方案就是从\((0,0)\)开始画一条只往右和往上的且只经过边界的线,那么所有在这条线上方的都会从左边出口出去,下面的都会从右边出口出去

我们枚举一下在下面的格子中位于左上顶点的格子(即它的左上角不存在其它合法格子),方案数为\(f_i=1+\sum_{x_j<x_i,y_j<y_i}f_j\),树状数组维护即可

CF674D

传送门

不会

每个点只记录来自儿子和自己的贡献,每个点将所有儿子的权值放进一个堆里并将儿子权值中最大最小值取出加入全局的堆里,维护即可

CF538G

传送门

不会

首先每次可以看做在\(x+y,x-y\)两维上独立的\(+1\)\(-1\),所以我们现在只需要考虑一维的情况

\(t=k\times l+p\),记走完\(l\)补之后在当前方向上的位移为\(x\),走完\(t\)的位移是\(s\),则走完前\(p\)步的位移就是\(f(p)=s-k\times x\)

将所有数按\(p\)排序,则有

\[\begin{aligned} |f(p_{i+1})-f(p_i)|\leq p_{i-1}-p_i \end{aligned} \]

而且要注意奇偶性。解方程之后将合法范围内任意一个\(x\)回代即可

AGC033F

传送门

不会

如果题目需要\(a,b,c\)按在树上这个顺序出现,那么\((a,c)\)之间有边的条件就是图上存在一条路径使得树上\(a,c\)的链上也是这个顺序,以每个点为根\(bfs\)一下就行了

然而现在是以任意顺序,那么我们考虑更改,如果在图上存在\((a,b)\)\((a,c)\)且树上以\(a,b,c\)的方式出现,我们就去掉\((a,c)\)并连上\((b,c)\),这样最终的边数是不会变的。更改的话就是我们动态加边,每一次用两个端点的边比较一下就行了

AGC035D

传送门

做过,这里

CF627F

传送门

不会

注意到操作可逆,也就是说我们走回去又走回来,树是不会变的

我们先从起点走到终点,如果此时已经合法了输出步数即可,否则我们需要把\(0\)放到一个环里,转上若干圈,那么外面的点和我们把\(0\)换进环里时换出去的点都是不会变的,里面会转上若干圈

那么我们就需要位置不对的点可以加上一个位置对的点构成环,且位置对的点到\(0\)的距离最小。如果环和\(0\)走的路径没有交,那么我们肯定是从路径上某个点走到环上去,然后走回来,否则就是走的时候顺便把环转了。顺时针逆时针分别计算方案数即可

ARC103D

传送门

不会

结论:对于\(d=\{1,2,4,...,2^k\}\),可以走到所有\(|x|+|y|\leq 2^k-1\)\(x+y\equiv 1\pmod{2}\)的点

大概就是归纳证明的亚子

显然所有数的\(x+y\bmod 2\)都要相等,如果都是偶数那么\(d\)集合中再加一个\(1\)即可

求方案数的话,每次把\(|x|,|y|\)中较大的那个的绝对值减去\(2^k\)即可

CF704E

传送门

不会

首先把路径树剖之后拆成\(O(\log n)\)条,然后对于每一条重链分别考虑

现在我们知道每条路径的起始时间,起始位置,终止时间,终止位置,我们把所有的路径都看做线段,那么就需要求出\(x\)坐标最小的线段交点

那么我们用扫描线维护,用\(set\)维护所有的线段,按纵坐标排序,纵坐标相等则按斜率排序,插入线段时将当前线段与前驱和后继的交点加入,删除时将后继与前驱的交点加入,将这些所有交点的横坐标贡献给答案。由于在碰到第一个交点之前所有线段的相对顺序是不会改变的,所以我们算出的第一个交点的横坐标一定是正确的

CF573E

传送门

不会

\(f_{i,j}\)表示前\(i\)个数中取\(j\)个的答案,转移如下

\[\begin{aligned} f_{i,j}=\max(f_{i-1,j},f_{i-1,j-1}+j\times a_i) \end{aligned} \]

有个结论,对于\(j\)存在一个分界点使得前面全都选前一种转移,后面全都选后一种转移,证明在这儿

用平衡树维护就行了

ARC093E

传送门

不会

先随便求出一个最小生成树,记为\(T\),显然\(w(T)\leq X\)否则无解

\(w(T)=X\)时,对答案会有一个\((2^{n-1}-2)\times 2^{m-n+1}\)的贡献(\(T\)中的边不能全部同色,其余的边随便染色)

否则,我们假设\(T\)中的边全为白色(全为黑色同理),那么一个染色方案合法,则一定存在一个\(T'\)使得\(T'\)是由\(T\)去掉一条白色边并加上一条黑色边构成的(至少要加一条黑边,显然不会加两条及以上的黑边)

我们记所有非\(T\)\((u,v)\)的权值\(cost(u,v)\)\((u,v)\)的权值减去\(T\)\(u\)\(v\)的路径上的最大边权,将所有边按\(cost\)排序,假设排序后位于第\(k\)个,那么方案数就加上\(2^{m-n+1-k}\)(只有后面的边能随意染色)

CF696F

传送门

不会

如果只需要一个圆,那么我们可以二分半径,然后用半平面交判断是否可行

而对于两个圆,最优情况一定是一个圆控制连续的一段,另一个圆控制另一段,那么我们可以用尺取法来判断以每个点作为左端点时最优的右端点是哪个,总复杂度\(O(n^2(\log v-\log \epsilon))\)

CF571E

传送门

不会

先将所有\(a_i\)就是答案的情况排除掉

对于两个等比数列,它们的交要么是空集要么也是一个等比数列(有可能公比为\(1\)),那么我们每次将两个等比数列合并直到剩下一个为止

设第一个等比数列的第\(x_1\)项和第二个等比数列的第\(x_2\)项相同\((x_1,x_2>0)\),那么有

\[\begin{aligned} a_1\times b_1^{x_1}=a_2\times b_2^{x_2} \end{aligned} \]

对于每个质因子\(p\),设\(x\)\(p\)的次数为\(e_p(x)\),则有

\[\begin{aligned} e_p(a_1)+e_p(b_1)\times x_1=e_p(a_2)+e_p(b_2)\times x_2 \end{aligned} \]

于是我们可以得到若干个关于\(x_1\)\(x_2\)的方程,方程组要么无解,要么有无数组解,要么有唯一解,用扩欧计算即可

最后剩下的等比数列的首项即为答案

AGC024F

传送门

不会

分别计算出每个\(s\)作为多少初始序列的子序列即可

判断\(s\)是否是一个串的子序列,我们可以贪心的用最前面的字符去匹配,这样可以保证一个字符串匹配完之后得到的串是唯一的

可以设一个状态\(f_{s_1,s_2}\)表示已经匹配完的部分是\(s_1\),未匹配完的部分是\(s_2\),此时的方案数,那么转移有三种,取\(s_2\)中第一个\(0\),取\(s_2\)中第一个\(1\),结束匹配并转移到\(f_{s_1,0}\)

方便起见可以设\(f_{s,i}\)表示\(s\)\(i\)位为\(s_1\),后\(i\)位为\(s_2\),以及需要将\(s\)的第\(k+1\)位设为\(1\)来避免\(s\)前面全是\(0\)的情况的讨论

AGC034D

传送门

不会

考虑费用流,但是我们不可能两两连边

注意到\(|x_i-x_j|+|y_i-y_j|=\max(x_i-x_j+y_i-y_j,x_i-x_j+y_j-y_i,x_j-x_i+y_i-y_j,x_j-x_i+y_j-y_i)\)

那么我们可以建四个中转点分别代表上面四种情况,每个点向着四个中转点连边,容量为\(1\),这样边数就降到\(O(n)\)

然后跑个最大费用最大流即可

CF611G

传送门

不会

对于每个点\(i\)我们求出一个最大的\(j\)使得\([i,j]\)这一边的多边形的面积小于等于另一边的面积(这里的区间指的是循环下的有序区间),那么中间的贡献是一个等差数列

由于叉积具有分配律,我们可以用前缀和优化

AGC030C

传送门

不会

如果\(k\leq 500\),直接输出\(k\)\(k\)列且\((i,j)=i\)即可

如果\(k>500\)\(k\)为偶数,那么我们可以分成两行,第一行为\([1,{k\over 2}]\),第二行为\([{k\over 2}+1,k]\),然后下面不断重复,但是这样有可能\({k\over 2}\)是奇数所以会有多余,解决办法是在第一行和第二行各取出一个数分别单独作为一行,这样行数的奇偶性不会改变,而列数的奇偶性改变了

如果\(k>500\)\(k\)为奇数,我们将\(k-2\)\(k-1\)\(k\)分别单独一行并将前面的按上面那种方法处理,不断取出数直到取出\(x\)个数后\({k-3-x\over 2}-x\equiv 0\pmod{5}\)为止

AGC038E

传送门

做过,这里

CF607E

传送门

不会

我们先将\((p,q)\)作为新的原点,然后考虑二分出一个半径\(mid\),使得半径为\(mid\)的圆内包含了至少\(m\)个交点

二分出半径之后,每条直线和圆的交点都是一条线段,那么此时两条直线的交点在圆内当且仅当它们的线段有交,这就可以转化成一个一维的问题了,问多少线段有交,设线段为\([l,r]\),我们每次在\(l\)位置查询\([l,r]\)内终点的个数,并将\(r\)插入即可,用树状数组维护

第二个问题是知道\(mid\)之后如何求出答案,由于此时交点个数最多为\(m\),我们可以用\(set\)来代替树状数组重复上面线段交的问题。不过有可能圆上会有多个满足条件的点,所以我们只考虑严格在圆内的点,如果此时点的个数小于\(m\),那么剩下的点的答案都是\(mid\),直接加上即可

AGC26F

传送门

不会

记先手为\(x\),后手为\(y\)

设所有奇数位的和为\(A\),偶数位的和为\(B\)

  • \(n\)为偶数,

如果第一步选了\(a_1\)\(a_n\),答案就是所有奇数位的和/偶数位的和,即为\(\max(A,B)\)

否则如果选了中间一个数,左右两边被分成了奇偶两段,\(y\)肯定会选择走偶数长度的那一段,因为这样\(x\)会得到这个数到其中一个端点的所有奇数位/偶数位的和,而在另一边\(y\)会得到先手权,此时\(y\)一定可以让答案不如第一种方案优,所以我们一定不会这么选

  • \(n\)为奇数

如果第一步选了\(a_1\)\(a_n\),答案就是所有奇数位的和,即为\(A\)

否则如果选了中间一个数,如果选在了奇数位,我们得到了一边奇数位的和,而\(y\)在另一边得到先手权,依然不如第一种方案优

所以我们肯定会选择一个偶数位,此时获得一边偶数位的和,另一边一定是奇数,会继续递归,而最终我们会选择一个区间\([l,r]\)取下里面所有的奇数位(注意此时\(l,r\)一定是奇数位)

那么我们可以先取下所有偶数位的答案,然后寻找一个区间\([l,r]\),贡献其中的奇数位减偶数位,并且\([l,r]\)中奇数位减偶数位的值最大,而\(y\)会让这个值尽量小

我们二分这个答案\(mid\),那么这个值可以大于\(mid\)当且仅当整个序列可以划分成若干极长连续段\([l_1,r_1],[l_2,r_2],...,[l_m,r_m]\),每一段的和都大于等于\(mid\)(奇数位贡献为正,偶数位贡献为负),且满足\([l_i,r_i]\)都是奇数,\(l_1=1,r_m=n,r_{i+1}=l_i+2\)

这个可以\(dp\),设\(f_i\)表示\(i\)是否可行(默认\(i\)为奇数),\(s_i\)为前缀和,那么有\(f_i=1\)当且仅当存在\(j<i,f_j=1,s_i-s{j+1}\geq mid\)

发现我们只要记录下\(f_j=1\)的所有值里最小的\(s_{j+1}\)即可,这样连\(dp\)数组都不用了

AGC035C

传送门

做过,这里

CF575E

传送门

不会

不难发现最优的圆一定是覆盖了所有的区域

那么我们可以先有一个无限大的圆,然后不断缩小直到覆盖了这些区域的凸包上的至少三个点

为了让半径尽可能大,我们需要让选的三个点尽量直,那么就选凸包上相邻的三个点就行了,用每一个相邻的三个点更新答案,半径最大的那个圆一定可以将整个凸包覆盖

AGC030D

传送门

不会

\(f_{i,j,k}\)表示现在在第\(i\)次操作之前,分别位于\(j\)\(k\)位置的数\((j<k)\),在最终序列中\(a_j\)\(a_k\)左边的概率,我们倒着做,发现每一次只需要修改\(O(n)\)个位置,所以总复杂度\(O(n^2)\)

AGC034F

传送门

不会

不难发现这个就等于从\(i\)第一次走到\(0\)的期望步数,记为\(f_i\),那么有\(f_0=0\),转移如下

\[\begin{aligned} &f_i=1+\sum_{j=0}^{2^n-1}f_{i\oplus j}\times p_j\\ &f_i-1=\sum_{j=0}^{2^n-1}f_{i\oplus j}\times p_j\\ \end{aligned} \]

\([x^i]F=f_i,[x^i]G=p_i,[x^i]H=f_i-1\),则有\(H=F\times G\)(这里的乘法是集合对称差卷积)

然而\(f_0\)不满足上面的等式,所以\([x^0]H\)是错的,但是我们注意到\(\sum p_i=1\),所以卷积之后和是不变的,那么\([x^0]H=f_0+2^n-1\)

\(p_0-1\),那么\(H\)每一项中所有的\(f_i\)都会被消掉,\(H\)的每一项都变成常数了

所以我们只要将\(H,G\)\(FWT\)之后,对应位相除即可得到\(F\)

然而这样是错误的,因为集合对称差卷积的定义是\(\hat{f_S}=\sum_{T\subseteq U}(-1)^{|S\cap T|}f_T\),所以\([x^0]H=[x^0]G=0\)!(而且\(H\)\(G\)中只有这两项为\(0\),因为其他项都必定小于\([x^0]H\)\([x^0]G\)),这样我们就无法还原出正确的\(F\)

但是我们已经知道正确的\(f_0=0\)了,在\(IFWT\)的时候,这个错误的\(f'_0\)对于每一项的贡献都是固定的\(f'_0\),所以我们只要让每一项都减去这个值就可以了

复杂度\(O(n2^n)\)

CF594E

传送门

不会

题解看不懂,咕了

ARC103F

传送门

不会

注意\(D_i\)最大的一定是一个叶子节点,我们考虑与这个叶子节点相邻的点,它一定等于\(D_i-n+2\)

由于\(D_i\)最小的一定是重心,我们可以以重心为根,然后按\(D_i\)从大到小遍历所有节点,那么遍历到一个节点时它的所有儿子一定已经遍历完了,记此时它所在连通块大小为\(sz_i\),它的父亲一定等于\(D_i+n-2\times sz_i\),由于\(D_i\)互不相等,我们可以唯一的找到这个父亲

这样就可以把所有的边连出来了。然而有\(n\)个点,我们只有\(n-1\)条边,也就是说我们用\(n-1\)个方程来判断\(n\)个未知数,这\(n\)个未知数不一定唯一。也就是说我们能保证所有\(D_i-D_j\)正确,但是不能保证\(D_i\)正确,那么随便找一个点\(dfs\)一下,康康它的\(D_i\)是否正确即可

CF674G

传送门

不会

考虑一个问题,从\(n\)个数中取出出现次数大于等于\(51\%\)的数,有一种方法就是维护一个\(x\)\(x\)的权重\(v\),从左到右扫所有元素,如果权重为\(0\)则让\(x\)等于当前元素,否则,如果\(x\)等于当前元素,令\(v+1\),否则\(v-1\)

这样最终的\(x\)是唯一一个出现次数可能大于等于\(51\%\)的那个数(因为如果这样的数存在,它一定会成为最终的\(x\),而且这样的数一定只有一个)

将它拓展一下,考虑如何取出出现次数大于等于\(\left\lceil{n\over k}\right\rceil\)的数,我们维护一个集合,集合中是二元组\((x,v)\),每次扫到一个元素,如果已经在集合中出现,则令对应的\(v+1\),否则,如果集合大小小于\(k\),我们加入二元组\((x,1)\),否则,令所有二元组的\(v-1\),并将\(v\leq 0\)的二元组移出集合。最后集合中的元素就是所有可能出现次数大于等于\(\left\lceil{n\over k}\right\rceil\)的数

证明的话,对于一个数\(x\),它的最终的权值一定大于等于\((x的出现次数-非x的数\times {1\over k})\),因为至少要加入\(k\)个数才有可能让\(v-1\),也就是说所有出现次数大于等于\(\left\lceil{n\over k+1}\right\rceil\)的元素最终权值一定大于等于\(0\),而出现次数大于等于\(\left\lceil{n\over k}\right\rceil\)的元素最终权值一定大于\(0\),所以一定在集合中

那么我们可以用线段树维护,每次合并两个区间时,将一个集合暴力插入另一个集合,分类讨论一下即可。对于询问,我们将所有区间合并之后判断每个集合对应的元素是否合法,具体就是维护\(n\)棵动态开点线段树表示每种颜色具体在哪些地方,以及一棵线段树维护每个区间是否同色,修改的时候一直向下递归到区间同色时修改即可,根据势能分析复杂度\(O(n\log^2 n+n\log n\times \left\lceil{100\over p}\right\rceil)\)

CF549E

传送门

不会

题解在这儿

posted @ 2020-06-11 21:30  源曲明  阅读(421)  评论(0编辑  收藏  举报