首页 > 其他分享 >Codeforces Round 982 (Div. 2)解题报告

Codeforces Round 982 (Div. 2)解题报告

时间:2024-11-01 20:57:53浏览次数:5  
标签:log 982 Codeforces popcount 打表 即可 Div SG 变成

Codeforces Round 982 (Div. 2)解题报告


A

显然答案不会小于 \(2(\max w+\max h)\)。

构造方案学习样例一,挺明显的。


B

有个小性质(好像没用):一旦能通过操作变成 non-increasing,再对整个序列操作一次必然变为同一个数字。

我们把一开始 remove 的数字记为A类,通过操作删掉的记为B类,保留的记为C类。

枚举第一个C类的下标,那么它前面的都一定是A类(因为操作不可能删空一个序列),后面的比它大的也一定是A类,其余的是B类最优。预处理每个位置后面比它大的数字个数 \(p_i\),答案就是 \(\max_{i=1}^n i-1+p_i\)。


C

加进来的零肯定动不了,问题变为每次选一个 \(i\) 使得 \(a_i+i-1=|a|\),得分和 \(|a|\) 都增加 \(i-1\),求最大得分。

由于 \(|a|\) 单调不减,能供操作的 \(i\) 一定是按照 \(a_i+i-1\) 升序,而且 \(|a|\) 增加类似转移,这提示我们往 DAG 想。每个点权值为 \(b_i := a_i+i-1\),连边到所有权值为 \(b_i+i-1\) 的点。用虚拟点辅助连边,bfs即可。\(O(n\log n)\)


D

简单的想法是DP,考虑 \(f_{i,j}\) 表示 \(a[1\cdots i]\) 已被消除,\(b\) 序列到了 \(j\) 的最小代价。则:

\[f_{i,j} \rightarrow f_{i,j+1} \quad s.t. \quad i<n \\ f_{i,j}+m-j \rightarrow f_{k,j} \quad s.t. \quad s_k-s_i \leq b_j \]

其中 \(s\) 是 \(a\) 的前缀和。

这样配合使用线段树转移, \(j\) 为第一层循环,每层 \(k\) 枚举的 \(i\) 一定是一段区间,找一个区间最小值。时间复杂度 \(O(nm\log n)\) 可以解决D1。

考虑D2求方案数,维护多一个 \(g_{i,j}\) 以及线段树中维护最小 \(f\) 对应的 \(g\) 之和即可转移,时间复杂度不变。


前四题均不超过蓝题水平,目测cf1900-。


E1

游戏规则就是取石子,但是只能够取当前个数二进制下某子集个,且最多取 \(a\) 个。关键算出 SG 值。

先考虑没有 \(a\) 限制的情况,打表发现 \(SG_i=popcount(i)\) 恒成立。数学归纳法证明如下:

\(SG_0=0,SG_1=1\)

若 \(\forall i<n,SG_i=popcount(i)\),则:

枚举 \(n\) 的后继 \(i\),\(n-i\) 的 SG 即为 \(n\) 某个子集的 popcount,且理所当然能够取遍 \(0,1,\cdots,popcount(n)-1\);至少取走一个,所以取不到 \(popcount(n)\) 以上。得证。

考虑有 \(a\) 限制时,发现 SG 只可能变小。

而且若 \(a\) 最高位为第 \(k\) 位,比 \(k\) 大的位永远取不走,相当于不存在,直接不要了就行。随后看留下的数字 \(x\)(此时 \(x\) 与 \(a\) 位数相同),如果 \(x\) 小于等于 \(a\),\(x\) 怎么操作都不受 \(a\) 影响,答案就是 \(popcount(x)\)。

于是只需要处理与 \(a\) 位数相同且 \(>a\) 的 \(x\) 的 SG 值即可。

之后打表猜了几个规律例如: \(a+lowbit(a)\) 以及依次迭代得到的所有 \(a\) SG 值变成0,其它不变;偶数就先加一再开始。但都不是太对。

看题解:发现如果 \(a\) 和 \(x\) 某一位都是 0 那么就可以把这位删掉,\(a\) 是 1 且 \(x\) 是 0 等价于 \(a\) 把这一位变成 0,后面全部变成 1。这样我们就能把 \(x\) 变成 \(2^k-1\) 的形式,只考虑 \(a\) 这一个变量决定 SG 即可。打表容易发现规律(题解有)。

利用此规律求出每堆石子的 SG,E1可通过,时间复杂度 \(O(n\log A)\)

分析为什么我没有做出此题,一方面是对博弈论过于依赖打表,对题目性质分析不够;另一方面是对这里二进制的感觉有些偏颇,看到 \(x\& d=d\) 这种限制就往lowbit这种二进制方向猜结论,就被迷惑了。实际上题解思路更加看重对大小比较的限制,才有了同时删去 0 以及"等价于 \(a\) 把这一位变成 0,后面全部变成 1"这样的关键分析。启发我们要对限制深入研究,总结自己推出来的小结论本质上究竟指向什么。


E2

由于 SG 值有限,数位DP 即可求出每种 SG 的方案数,再异或卷积即可。

DP 大概就是记录当前 \(x\) 到第几位,\(a\) 删了几个 0,是否剩下全为1之类的,用于判断最后的SG。\(O(n\log^2A)\)


标签:log,982,Codeforces,popcount,打表,即可,Div,SG,变成
From: https://www.cnblogs.com/zsj6315/p/18521266

相关文章

  • Educational Codeforces Round 20 E. Roma and Poker
    差分约束我们记W表示\(1\),L表示\(-1\),D表示\(0\),然后记前\(i\)位的前缀和是\(dis[i]\)。则我们可以根据题面得到如下约束。当前位是W,则有\[\left\{\begin{matrix}dis[i]-dis[i-1]\le1\\dis[i-1]-dis[i]\le-1\end{matrix}\right.\]当前位是L,则有\[\left\{\begin{m......
  • Codeforces Round 977 (Div. 2, based on COMPFEST 16 - Final Round)
    Preface这场其实是上周四VP的,因为当时马上要出发打济南站了,但因为挺久没写代码了所以打算临阵磨枪一下好家伙结果Div.2D不会做直接给人整麻了,不过好在看了眼榜把E2写了,后面发现这个D想到了就不难A.MeaningMean容易发现从小到大操作一定最优#include<cstdio>#inc......
  • dreamweaver家乡主题网页设计 DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下
    家乡旅游景点网页作业制作网页代码运用了DIV盒子的使用方法,如盒子的嵌套、浮动、margin、border、background等属性的使用,外部大盒子设定居中,内部左中右布局,下方横向浮动排列,大学学习的前端知识点和布局方式都有运用,CSS的代码量也很足、很细致,使用hover来完成过渡效果、鼠......
  • Educational Codeforces Round 171 (Rated for Div. 2)B-D
    B.BlackCells题目:思路:首先我们发现要分奇偶讨论。偶数:很简单,取a[2]-a[1],a[4]-a[3],.........a[n]-[n-1]的最大值。奇数:我只需要知道假如删除当前的这个数剩下的数最大的间隔值,注意只能删除1,3,等奇数位,因为要保证删除后左右的数为偶数。(我的代码里面是偶数位因......
  • Codeforces Round 978(div.2) D1
    #感觉挺有意思的一道题题目:思路:观察发现对于两个人a,b如果两个人里面没有Impostor那么,你得到的回答是一样的,如果有impostor那么结果不同,那么我们就可以两个两个的询问,先找到2个人里面有impostor然后在找另外一个人来询问就行了。代码:#include<bits/stdc++.h>usin......
  • Codeforces Global Round 27,D. Yet Another Real Number Problem 题解
    单调栈+贪心题意:给定一个序列从左往右对于每个索引iii,求出其前缀的数组可以进行任意次以下操作的条件下:选择......
  • Codeforces Round 981 (Div. 3) ABCDE
    CodeforcesRound981(Div.3)ABCDEA.SakurakoandKosuke藕是看样例直接猜了结论......
  • CF980-Div2-D
    CF980-Div2-D题意从\(1\)开始决策,若选当前数,则累计贡献\(a[i]\)并跳到\(j\)位置,\(j\)是\(\lti\)且没有决策过(包括选了和没选)的最大位置(操作\(1\))。若不选当前数,则跳转到\(j\)位置,\(j\)是\(\leb[i]\)且没有决策过(包括选了和没选)的最大位置(操作\(2\))。求最大得......
  • Codeforces Round 982 (Div. 2)
    CodeforcesRound982(Div.2)总结A猜结论,最后的图形的周长都能移成一个长方形的周长,这个长方形就是\(w\)和\(h\)的最大值。#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include<q......
  • CSS(块级,行级,行块级,display,div和span,盒子模型,文档流,浮动)
    块级,行级,行块级块级:无论内容都是,都会独自占据一行的.可以设置宽高,若没有设置宽高,默认于父级标签相同.例如:<p>,<h1>,<ul>,<ol>,<hr/>等.行级:只占自身大小的标签,不会占一行.设置宽高无效.例如:<font>,<b>,<i>,<a>等.行块级:不会占一行,而且可以设置宽高.例如:<inp......