luoguP2612
设一个排列的权值为相邻两数差的绝对值之和,求长度为$n$的随机排列权值不小于$m$的概率($n\le100$)
考虑一个填完的排列中每个数对答案的贡献,
设当前填的数为$b$,其前后的数分别为$a$和$c$,则有三种情况:
- 当$[a<b\land c<b]==1$时,答案要加上$|a-b|+|b-c|=2\times b-a-c$,$b$对答案的贡献为$2\times b$
- 当$[a<b\oplus c<b]==1$时,答案要加上$|a-b|+|b-c|=|a-c|$,$b$对答案的贡献为$0$
- 当$[a>b\land c>b]==1$时,答案要加上$|a-b|+|b-c|=a+c-2\times b$,$b$对答案的贡献为$-2\times b$
为了消去绝对值的影响,我们从小到大填数。
在从小到大填数时,出现情况1说明填当前位置时左右都非空,出现情况2说明左右有一个非空,出现情况3说明左右都为空,而且如果填在两端要特殊处理一下。
考虑用$f(i,j,k,t)$表示已经填了$i$个数,构成了$j$个连续段,答案为$k$,有$t$个端点填了数的方案数,其中$i\in[0,n],j\in[0,\lceil\frac{n}{2}\rceil],k\in[-4500,4500],t\in[0,2]$,
如果不填在两端,根据上面的情况,有三种转移方式:
$f(i,j,k,l)\longrightarrow f(i+1,j,k,l)$
$f(i,j,k,l)\longrightarrow f(i+1,j+1,k-2\times i,l)$
$f(i,j,k,l)\longrightarrow f(i+1,j-1,k+2\times i,l)$
如果填在两端,有两种转移方式(端点旁边是否有数):
$f(i,j,k,l)\longrightarrow f(i,j,k+i,l+1)$
$f(i,j,k,l)\longrightarrow f(i,j+1,k-i,l+1)$
转移时注意乘上可以选择的方案数。
这题着实恶心,得面向数据范围编程,$k\le8$用long double,否则用__float128才能过,所以写的又臭又长,这里只放了dp部分的代码
1 | f[0][0][D][0] = 1; |
CF908G
$S(n)$为$n$所有位数非降序排列后的数值,求$\sum_{i=1}^X S(i)\mod 10^9+7$($X\le10^{700}$)
应该是自己做过的第三道数位dp,数位dp好难啊
看这个数据范围,$10^{700}$,显然是数位dp,但有一说一确实挺怪的,
河里猜测,状态数应该是$700\times 700\times 10\times x$,
然后就不会了(
看了别人的题解,发现其实还是挺好懂的,
举个例子,$S(114514)$可以拆成三部分的贡献:$S(114514)=111445=111111+111+1$(其实是九部分,对应$1-9$),
因此可以分别枚举每个位置产生的贡献之和,然后分别加起来,
具体来说就是
没写完
1 |
|
CF1142D
给定$n$个非降序排列的数组,第$i$个数组长度为$t_i$,每次操作可以取出任意数组最左边的数(相当于删除)并加到答案里,求$k$次操作后的最大答案($n,k\le3000$)
一个显然的结论是,最多只有一个数组被取数但没有被全取完,利用反证法容易证明。
根据这个结论,最暴力的办法就是考虑枚举没选中的数组然后对其他的做一遍背包,
但是这是$O(n^2k)$的,显然会超时,s思考后发现,在枚举不同数组进行背包的时候,只有两个物品不同,其他$n-2$个都是一样的,
因此可以考虑如何重复使用这些物品,起码要优化到$O(nk\log n)$才行,
既然带了个$\log$,大概率要用线段树,
朝着这个方向想想,结果就出来了,
我们可以在线段树节点$(i,l,r)$上用$f(i)$来储存除了$l,r$数组之外的所有物品做$01$背包后的结果,
这样就把$n^2k$枚举时的加减物品变成了从根到叶的加物品操作,
叶节点即为之前所枚举的没有被全取完的数组,复杂度$O(nk\log n)$。
1 |
|
300iq Contest 3 C
在写了在写了
在写了在写了
1 |
|
CF729F
给定一长度为$n$的数组,$A$和$B$分别从左右端取数字加到自己身上,设$A,B$的分数分别为$W_A,W_B$,$S=W_A-W_B$,$A$想让$S$更大,$B$想让$S$更小,$A,B$都会采取最优策略,求最终$S$的值($n\le4000$)
在写了在写了
1 |
|
2019CCPC秦皇岛G
在写了在写了
在写了在写了
代码:
1 |
|
- [ ] 2020ICPC上海F
- [ ] CF1428G
- [ ] CF1383C
- [ ] 2018CCPC吉林
- [ ] DTOJ4632(没找到链接)