「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分)

 

  不过说实话题是我自己做的我也怨不上别人。但是类似的傻逼问题我已经不是第一次了,做题要耐心要细致,耐心,细致的审题是必要的,不要把这当成浪费时间,读错题浪费时间浪费分数,说白了还是浪费人生,比赛要真出了这么个问题不是要回家哭死,现在犯了就犯了总比以后犯要好。

  那么下次的目标就是:审题细致,做题极致。

posted @ 2019-08-02 07:58  Lrefrain  阅读(493)  评论(5编辑  收藏  举报