洛谷P4428二进制 [BJOI2018] 线段树

正解:线段树

解题报告:

传送门!

话说开始看到这题的时候我想得hin简单

因为关于%3有个性质就是说一个数的各个位数之和%3=这个数%3嘛,小学基础知识?

我就想着,就直接建一棵树,只是这棵树要用个数据结构分别存下%3=0,1,2然后大力走一波就好辣

然后我仔细思考了一下,发现因为它是要连续一个区间所以我可能这个数据结构中要有9个数

前三个不变,第四个到第六个是连着左边的%3的余数,第七个到第九个是连着右边的%3的余数,依然是大力走一波

但是我jio得应该不会出这种并没有思维难度然而实现难度又很大的题目啊,,,?

于是我就又去看了下题目

发现我读错题意了:D

大概说下我错哪儿了

就是因为它是个二进制数并且可以移动嘛

扫描二维码关注公众号,回复: 5111435 查看本文章

我开始觉得是,因为%3的余数=各位之和%3所以不管怎么动余数都不变啊

然后我仔细一想,,,发现因为它是二进制表示所以移动是可以影响余数的TT

所以前面所有推理全部垮掉,重新想性质QAQ

不难发现如果能实现就是有偶数个1或者有奇数个1并且01数量都>=2

证明一下

因为22%3=1嘛,所以2的奇数次方都相等,2的偶数次方也都相等(显然?不解释了QwQ

那就可以算出来22k+1=2 22k=1

然后关于取模这个有个小学知识?就是和取模等于取模的和取模

那如果现在有偶数个1,就很简单,把一半放在奇数位一半放在偶数位就好了,多的0全丢前面去,显然可以

如果有奇数个1怎么搞呢,就可以额外拨出3个来放奇数位,就成为偶数的情况了

那就要求1的个数>=3并且0的个数>=2嘛(因为奇数位放了1至少要有俩偶数位把他们隔开就得是0啊QAQ

综上,我们可以推出有偶数个1或者有奇数个1并且01数量都>=2时是能实现的!

证毕

然后因为合法的情况比较多存起来转移什么的都比较麻烦

于是考虑用总数-不合法的情况就是合法的情况了嘛!

那不合法的从我们上面就可以推出来,当有奇数个1并且0的个数<2或者只有1个1的时候就会不合法

于是接下来我就不会做了

所以接下来的都是灵巧看了题解才懂的QAQ

题解有两种,第一种我jio得有点迷第二种我jio得太难了,,,

先说下解法二趴QAQ

解法二是个很神仙的东西,它牵扯到了一个神仙dp,动态dp,,,

首先我们思考如果没有修改我们怎么做

就设dp[0/1][0/1][k]表示有没有1,1的奇偶性,有几个k

然后大力转移?(*这个状态这里我还没有完全理解:D

问题在于它有修改欸,,,还有1x105组,那就显然会T飞啊QAQ

所以就要引入动态dp了,,,我没想到我居然接触动态dp这玩意儿接触得这么早?什么鬼畜东西QAQ

这里的动态dp是把dp引入到了线段树上,大概是这样子的:

因为线段树上每个节点都是表示的一个区间[l,r],对于每个节点,我们记录1个dp值

dp[0/1/2/3][0/1][0/1][0/1],下面分别解释下这几维

第一维是用来记录状态的,它分别记录了,不含左右节点,只含左节点,只含右节点,以及两个节点都包含

第二维记录1的个数的奇偶性

第三维表示是否1的数量<=1

第四维表示是否0的数量<=1

但是这样子的话,有两个问题

第一个转移转的很麻烦

第二个这样子常数很大(,,,dbq这个地方我真的不会分析,,,题解中说常数很大那就大趴,,,QAQ

那我们就可以把一棵树拆成两棵

第一棵记录dp[0/1/2/3][0/1][0/1],就去了第二维

第二棵记录dp[0/1/2/3][0/1],就有个第二维还有个第一维

因为我们可以发现当1的个数是偶数的时候我们并不care1的数量0的数量的

所以常数会小一些,而且转移相对而言比较好写

转移先咕着,,,今天会写的而且会把代码放上来的QAQ

所以谢总为什么会在线段树题目里放这么难的题目,,,我本来以为会比较简单的现在发现我离原地爆炸不远了,,,TT

猜你喜欢

转载自www.cnblogs.com/lqsukida/p/10332475.html
今日推荐