「2019.8.1 考试」做题需要耐心和细致
先总结一下考试过程,大概就是打了T1暴力然后打了T2暴力然后打了T3暴力,然后打了T3正解。然后T3第二问读错题错丢40分我真是个傻逼。。。这样从160变成了120,从rk3变成了rk5,我磕爆。T1暴力打的很顺一遍过样例,手玩了几下发现没问题,T2一开始想用$3^n$的补集来做,但是发现复杂度过高而且会出现各种无用状态,于是打了离散状态$dp$,这时候还剩下俩小时左右,诚信诚意干T3,发现很水,结果我读错题我xxxxxx。
不喷了,大概还是因为不够细致吧。
说一下题解。
T1:水题,考场上看出来是线段树不过觉得不太好写就弃掉了先做T2T3,考后发现他卡掉了桶合并的解法,于是换成了玄学复杂度的递归,终于A掉了。
T2:神dp。考场上就打了个状压拿到20分,正解很神,考后想了好久才明白的。
设$dp[i][j]$为左端点在第$i$列以左的右区间中放了$j$个的方案数,$l[i]$为左区间端点个数的前缀和,$r[i]$是右区间端点的前缀和。
初始化:$dp[1][0]=1$
目标:$dp[m][n]$
方程:
1. $dp[i][j]=dp[i][j]*A_{i-j-l[i-1]}^{l[i]-l[i-1]}$
2. $dp[i+1][j]+=dp[i][j]$
3. $dp[i+1][j+1]+=dp[i][j]*(r[i+1]-j)$
解释一下。
第一个方程维护了状态的有效性,我们用$ A_{i-j-l[i-1]}^{l[i]-l[i-1]} $来维护状态是否合法,下面是左边最多能放的个数,上面是左边必须放的个数,如果下面小于上面显然会返回0,与此同时也判定这个状态不合法,对其他状态的贡献为0。而为什么是排列呢?
首先区间并非序列,他们每个人占第多少行的确是应当用排列,但这样多次乘排列,而不用组合数为这些新增排列在以前的排列中插板,难道不会漏掉一些情况吗?不会的。这相当于是一种分步排列思想,因为前面的排列只能被限制在$i$指针以前,而如今的就不被限制在之前$i$指针以前了,这样情况在大小上应当是比乘组合数小,这是一个感性理解。理性判别一下的话,你可以写一个树状分类图,把各次的选的位置排列全都画出来,最终你会发现这棵树等深度的兄弟都具有相同的儿子数,而每一深度单点的儿子数正好就是我们乘的排列数,也就是说他们每个都可以转移到相同多的状态,换成数学表述就是,乘法原理,不过是排列的乘法。
第二个方程,维护的是一个也不放的情况,也就是作为阶段继承。
第三个方程,维护的是在右侧放一个的情况,这时候可以放但是没有放的就$r[i+1]-j$个,所以乘上去。
话说我排列方程写错了调了半天。。。
T3:
现在一看还是蛮水的,那个看似很长的式子的意义其实是逻辑左移动,就是最高位会出现在最低位的意思。
那这题没了。
推个式子,左移动符号暂时表示右移动。
$a[i]$是$xor$前缀和。
那么$ans=((x xor a[i])<<1)\ xor\ (a[m] xor a[i])$
$ans=(x<<1)\ xor\ (a[i]<<1)\ xor\ a[m]\ xor\ a[i] $
$d[i]=(a[i]<<1)\ xor\ a[m]\ xor\ a[i]$
$ans=(x<<1)\ xor\ d[i]$
意思就是让你找一个值让他$xor\ d[i]$最大。
建个01trie。
在上面跑dfs,如果有两个儿子,不改变$ans$值,如果是一个儿子,当前深度位上加一。
为什么这样做呢?所谓最优决策,因为自己是先手,所以其实找的是所有最小值中最大的一个所对应的值,而对手后手可以根据x来决策,那么如果有两个儿子,不管x这一位是0或者1他都可以走某一个儿子那条道路从而xor使这一位变成0,但是如果某个地方只有一个儿子,那么x就可以选择相反的数,这样他无法让你变成0,从而这一位加一,dfs是因为可以枚举每种情况,最后mp统计方案就好了。
(说的真轻松我把统计方案看成计算x原值结果错失40分)
不过说实话题是我自己做的我也怨不上别人。但是类似的傻逼问题我已经不是第一次了,做题要耐心要细致,耐心,细致的审题是必要的,不要把这当成浪费时间,读错题浪费时间浪费分数,说白了还是浪费人生,比赛要真出了这么个问题不是要回家哭死,现在犯了就犯了总比以后犯要好。
那么下次的目标就是:审题细致,做题极致。