首页 > 其他分享 >Codeforces Round 941 (Div. 2) D

Codeforces Round 941 (Div. 2) D

时间:2024-04-28 18:34:09浏览次数:25  
标签:这个 数字 二进制 题解 ll Codeforces 941 思路 Div

好坐牢的一次div2

ABC是速通的,结果cf的pretest太弱了。。然后我这次因为想快点,没有再去好好顺一遍思路,状态又不太好,写了一个好简单的错,结果过了。导致我被hack了,爆掉100分。

好烦。

主要说说这个D。
现在能够从算式的层面上理解了这个做法的正确性,就是把二进制位的数字放进去,然后把k的最高位的1对应的二进制数字去掉,加上下面三个数字\(k-2^i,k+1,k+2^i+1\),其中\(i\)是k的最高位1的位置。
然后推导一下,分为3个部分
第一个部分,对于\(1\leq v <2^i\)的部分,直接二进制分解正常做
第二个部分,对于\(2^i\leq v<k\)的部分,我们先把所有\(j<i\)的\(2^j\)全部选上。这个时候,这个整体的值\(=2^i-1\)。我们的v是大于\(2^i\)的,也就是说,我们是一定需要\(k-2^i\)这个数字的,否则仅是用那些下面的数字是做不到的。我们先把下面的数字全部选上,得到的和是\(2^i-1\),再加上这个数字,得到的和是\(k-1\)。我们的目标是v,也就是我们需要从\(k-1\)中选择一些删去。因为\(v\leq k-1\),所以,一定能够通过减去一些数字得到v,而v的最高位是和k一样的,所以最高位一定不会减去。我们已经把所有\(<i\)的位置全部选择,也就是我们只用通过选择那些已经选上了的位置哪些不要就可以凑出所有\(\leq 2^i-1\)的数字,这也是v和k不一样的地方。正确性得证了

第三个部分,对于\(k<v\),\(v-k-1\)明显是大于0的,也就是可被凑出来的,那用这个数字加上\(k+1\)就可以了。
假如,凑出\(v-k-1\)需要用到\(2^i\)这个数字,那就把\(k+1\)换成\(k+1+2^i\)就可以了。

这三个部分都是可实现的,正确性有了。但是tnnd怎么想啊,这怎么想的到的啊。

题解只讲做法,不讲思路。唉,仅仅是"题解"的题解,总感觉是不完整的。

首先二进制分解的思路是没有问题的。有问题的是构造的方法,准确说是怎么想到这个构造的方法,有没有一个顺畅自然的思路。
这题还是挺少见的。但是普通的思路却又没有办法,就很恶心。很明显的感觉到我缺了一部分,但是又不知道是那一部分。考察在了一个隐蔽的点吧。
从开始考虑吧。
首先,我要能够凑出1到n的所有数字,二进制分解是绝对的思路。
那现在的问题是,如何改写其中的几个数字来满足我们无法得到k的需要。
大框架是不能动的,否则是很麻烦的,而且很明显二进制已经是唯一的解法了。
对于简化的问题,假如k的二进制表示一定只含有1个1,那解法是很简单的。我们的数组里面不包含这个数字,那我们对于比这个数字大和比这个数字小的数字分别讨论,这个是很简单的,对于小的不用考虑,对于大的,就只需要补一个\(k+1\)和\(k+2^i\)就好了。

这个已经出来了,其实真正卡住我的就是上面题解的第二个部分的构造方法。感觉比赛的时候没有专门把第一类和第二类区别开,主要是当时也没有确定思路就是去掉最高位。当时也是尝试去掉最高位,然后就发现了第二类的构造困难,也就是,我没有\(2^i\)这个高位,我需要补上一个什么样的数字来构造其他位置的数字,并且完美避开k呢?到这里就找不到了,想了一个类似锁与钥匙的模型,就是打开\(2^i\)这个数字的锁需要\(k-2^i\)这个数字里面对于的二进制的1没有全部被用上,这个是他的钥匙,但是什么样的构造能满足这样的需求?想不到。
看看上面的答案,非常喵,构造的答案都写出来了。
真是。。戏剧性啊。。

标签:这个,数字,二进制,题解,ll,Codeforces,941,思路,Div
From: https://www.cnblogs.com/HLZZPawa/p/18164272

相关文章

  • Solution of Codeforces 1957B
    DescriptionGivenintegers\(n\)and\(k\),findanon-negativesequence\(\{a_n\}\)satisfyingthefollowingconditions:1.\[\sum_{i=1}^na_i=k\]Thebinaryrepresentationof\(a_1\mida_2\mid\dots\mida_n\)hasthemaximumnumbero......
  • js调整div顺序
    js调整div顺序并保留div原有事件等<divclass="my_tabs"><divclass="el-tabs__nav-scroll"><divclass="el-tabs__nav"><divclass="el-tabs__itemis-active">AAAA</div><d......
  • Codeforces Round 936 (Div. 2)
    A考虑有\(x\)个数与中位数相同,且在中位数之后,则答案为\(x+1\)(+1是因为中位数本身)。B明显的,每次操作序列的最大子段和。那么操作完以后,继续操作这个区间即可,相当于每次翻倍。假设原序列最大子段和为区间\([l,r]\),则答案为:\[sum(1,n)-sum(l,r)+sum(l,r)\times2^k\]记......
  • Codeforces Round 931 (Div. 2) D2
    挺简单的题目,就是一个普通博弈论套了一个交互的皮。。。但是恶心的就是,交互的皮是真难顶啊,什么sb玩意,我因为爆了int一直给我现实TLEontest1,这我怎么调?不得不说,交互题和普通的题目真是差别太大了,就评测这一块,返回的消息完全无法给我有效的指导。。然后我就直接坐大牢。要是这......
  • Codeforces Round 939 (Div. 2) E1-E2
    CodeforcesRound939(Div.2)E1.Nenevs.Monsters(EasyVersion)题意:有n个怪物,能量等级为\(a_i\),现在可以使用一种法术,使第1个怪物攻击第2个怪物,第2个怪物攻击第3个怪物……第n个怪物攻击第1个怪物,当能量等级为x的怪物攻击能量等级为y的怪物时,怪物y->max(y-x,0),在经过\(1......
  • Codeforces Round 892 (Div. 2) E
    E的话一眼dp,然后观察一下方程,\(f[i][j]表示前i个位置已经选了长度为j的区间,且第i个位置已经被选上时,能够获得的最大值\)\[f[i][j]=\displaystyle\max_{1\leqk\leqmin(i,j)}(f[i-k][j-k]+calc(i-k+1,j))\\calc(l,r)=|b_l-a_r|+|b_r-a_l|\]这样的dp是\(O(n^2k)\)的,而\(1\leqk......
  • cf 1601B Frog Traveler Codeforces Round 751 (Div. 1)
     Problem-1601B-Codeforces BFS然后每次上升可以的范围是一个区间,然后每次都遍历这个区间的所有点,那么超时。用set等方式,合并这些区间,之前没遍历过的范围才更新(加入BFS需要遍历的队列里)。但是区间的更新特别容易写错…… 我的代码和造数据1/**2记录两个vi......
  • Codeforces Round 940 (Div. 2) and CodeCraft-23 题解
    CodeforcesRound940(Div.2)andCodeCraft-23题解题目链接A.Stickogon贪心#include<bits/stdc++.h>usingnamespacestd;#definefffirst#definesssecond#definepbpush_back#defineall(u)u.begin(),u.end()#defineendl'\n'#definedebu......
  • Educational Codeforces Round 164 (Rated for Div. 2)
    A.PaintingtheRibbon题意:n个物体,m个颜色,alice要给每个物体任意涂一个颜色。bob可以给k个物体涂色,问alice能否阻止bob让所有的物体颜色都相同。思路:思维题。如果m=1,那么无解。如果m>1,那么bob如果想要染成同一个颜色,alice可以让bob需要染色的数量最多。如果染色的数量最多,那......
  • Codeforces Round 906 (Div. 2) E1
    时隔了不知道多久的补题。两个月吧,这是可是寒假的比赛。但是补题的时候还是遇到了很多问题。很重要的有一些地方能够简化,一些条件没有充分的利用上,导致了我很多地方考虑的太复杂。这些能够简化的地方全部利用上我觉得才算是写出来了这道题目,否则这题会复杂到我赛时写不完,而且特......