Codeforces Round #210 (Div. 1) (A, B, C)

来源:互联网 发布:阿里云备案导入 编辑:程序博客网 时间:2024/05/16 11:25

code:https://github.com/9974/Codeforces/tree/master/210div1

A

先倒着暴力处理询问, 然后正着check一下是不是符合要求。

B

求最大值最小,很典型的二分,一维dp判断是否合法 O(n*n*log(n))

dp[i]表示进行到第i位,且第i位不放的最小修改个数, 对于dp[i] 可以由dp[j]转移,j+1-----i-1都要修改,这时区间j----i的最小差距为 abs(a[i]-a[j])/(j+1到i-1的个数) 并向上取整,当然转移时必须让最小差距  <=  二分的mid

C

个人能力太弱,弄了一整天终于明白了

dp[i][j][0],dp[i][j][1],dp[i][j][2],分别表示进行到i美丽值为j 且s[i] 小于,等于,大于 t[i] (后面没取的就当与s[i]相同)

当i位取 t[i] <= s[i],美丽值均不变,则有

dp[i][j][0] = (dp[i-1][j][0] + dp[i-1][j][1] + dp[i-1][j][2])*(s[i] < t[i]的字母个数);

dp[i][j][1] = dp[i-1][j][0] + dp[i-1][j][1] + dp[i-1][j][2];

当i位取 t[i] > s[i], 美丽值改变

位置i可以由位置t转移过来,且区间t+1-----i-1 中 所有s[] == t[], j值增加了 (n-i+1)*(i-t) (自己想想清楚);

由于 (n-i+1)*(i-t) 是一个二次函数, 能符合要求的t不会很多,所以转移并不是O(n)的

dp[i][j][2] = (dp[t][j-(n-i+1)*(i-t) ][0]dp[t][j-(n-i+1)*(i-t) ][2])*(s[i] > t[i]的字母个数);

仔细思考可以发现大于小于两个状态可以合并,我写的代码也是合并后的情况。