标签:问题 直线 article 排列 是你 esc 数学 要求 除了
A组:
T1:
string
Solution:
注意到,只有26个字符。用一个线段树,维护区间a~z的个数。
每次操作,求出总共的a个数,b个数。。。。z个数。
26次区间修改即可。把前k1个变成a,k1+1到k1+k2个变成b.....
T3:
number
直接数位dp。但是(3)条件还要记录出现了哪些数字。很麻烦。
n<=20,直接bool记录这个位置的数有没有出现过,2^20肯定不行。
如果记录0~9每一个数出现次数,以出现次数最多的数的个数为进制数呢?显然,很多状态都是没有用的。
还是会被卡到10^10更惨。
zyz:变进制法,1~9开一个桶,有多少个数,就是几进制。那么一个状态S就代表:k0+ k1*num0+k2*num0*num1+...k9*(num0*...*num8)
ki表示,i这个数在状态中出现的次数。numi表示,原来n中,i出现的次数。
转移,提取i这一位,S%∏(num0~i)/∏(num0~i-1) (类似一般10进制的取法)
如果能多取,i多取了一个,转移到S+i*∏(num0~i-1)
变进制法不错的讲解:NKOJ1633 神仙开山【变进制数状压DP】
这样,很多多余的状态就都压进去了。总共不到2000个状态。
我的做法:暴力找到所有可能的情况,暴力n^2判断能否相互转移。给每个情况开一个vector啥的。转移直接访问vector
反正2000的情况,也能过,就是不优美。
B组:
T1:
rectangle:显然k个点必定摆成以下两种情况可能最优:
XXX...XXX
XXX...XXX
.
.
.
XXX...XXX
X..X
XXX...XXXX
XXX...XXX.
. .
. .
. .
XXX...XXX
所以只要枚举一行的个数(或者一列的个数)。
假设第一种情况除了最后一行每行都是i个,那么矩形的个数就是C(k/i,2)*C(i,2)+C(k%i,2)*k/i,第二种情况同理。
(来自题解)
标签:问题 直线 article 排列 是你 esc 数学 要求 除了
原文地址:https://www.cnblogs.com/Miracevin/p/9500631.html