codeforces 157 div1(完全)

我是div2选手!!!

碰上了自己不擅长的数位DP,各种囧啊,前三题水的一逼,我还wa了一次,然后妥妥的掉分了

A题:

如果有零的话,去掉从左往右数的第一个0即可

B题:

这类题目以后要多多加强啊,这道题先预处理出cnt[i],表示有i个lucky dig的数有多少个,这个过程用到了数位类DP的基本方法

处理出来后可以用一个dfs暴力求得答案

戳这里看代码

C题: 让你构造一个序列,序列的最小公倍数就是这个序列中最大的数,而且每个数分别小于另一个序列,求可以构造多少个这样的序列。 显然,这个序列中除最大的那个外所有的数都是它的约数,所以可以枚举这个最小公倍数,然后处理出所有的约数。然后问题就变成 : 将所有的约数放到n个位置(约数要小于等于所放位置的ai),可以重复 ,有几种放法,注意,最大的那个也就是所枚举的最小公倍数是一定要有一个位置放的。然后就这样了

戳这里看代码

D题:

给你一个初始序列,然后有m个操作,每个操作会以0.5的概率交换两个数,最后问你操作完成后这个序列逆序数的期望

试想如果知道了第i个数大于第j个数的概率,那么只需要将所有的dp[i][j](i < j) 相加就是期望了。

设dp[i][j]表示第i个数大于第j个数的概率,初始化的时候序列是固定的,所以要么为1,要么为0. 对于每一个操作a b,会改变所有的dp[i][a] dp[a][i] dp[i][b] dp[b][i]  (i!=a&&i!=b) 也就是跟a b 有关的状态,所以需要枚举每一个i,如果不交换a b两个位置的数,简单,原来dp[a][i]的概率乘个0.5就好了, 如果交换  ,当前a位置的数就变成当前b位置的数了,那么dp[a][i] = dp[a][i] * 0.5 + dp[b][i] * 0.5(当前a位置的数从b位置拿过来的) ,就这样,我还在位置与数值之间傻逼了半天了呢!

戳这里戳这里

E题:

比较常见的树形结构转换成线性结构用线段树来做.

推荐两个题 这题 和 那题

这个题的话需要记录每个点和谁一起进行过操作,每次每个点单独处理,将跟这个点一起操作的所有的邻接点所代表的区间都放进线段树,统计总点数的时候就相当于 的区间合并吧。

戳这里看代码

你可能感兴趣的:(codeforces 157 div1(完全))