cf924B
转移自老blog
让你找一个三元组 i<j<k且a[k]-a[i]<u
最大化(a[k]-a[j])/(a[k]-a[i])
显然当i,j固定后这个值整体上是小于1的,
所以k越大越好,整体值越大
然后我们发现,当i,j固定后,k的值只与i有关,因为a[k]-a[i]<u
也就是说不管我们枚举的i和j如何,k只与i有关,不妨设k=f(i)
我们现在考虑枚举i,于是k的值也确定了,为f(i)
这时候,j显然越小越好,于是j=i+1最优
第一个做法出来了:
枚举i,则j=i+1,根据a[k]<a[i]+u,可以二分出k
第二个做法:
枚举i,则j=i+1,容易证明f(i)关于i单调递增,于是用双指针扫描即可
cf924B
链接
题意
给你长度为n的单调增数组a[],以及一个u让你找一个三元组 i<j<k且a[k]-a[i]<u
最大化(a[k]-a[j])/(a[k]-a[i])
题解
我们考虑枚举i,j显然当i,j固定后这个值整体上是小于1的,
所以k越大越好,整体值越大
然后我们发现,当i,j固定后,k的值只与i有关,因为a[k]-a[i]<u
也就是说不管我们枚举的i和j如何,k只与i有关,不妨设k=f(i)
我们现在考虑枚举i,于是k的值也确定了,为f(i)
这时候,j显然越小越好,于是j=i+1最优
第一个做法出来了:
枚举i,则j=i+1,根据a[k]<a[i]+u,可以二分出k
第二个做法:
枚举i,则j=i+1,容易证明f(i)关于i单调递增,于是用双指针扫描即可
cfedu57D
转移自老blog
1<=n<=1e5
dp[i][0] 前缀i不包含子序列h的最小代价
dp[i][1] 前缀i不包含子序列ha的最小代价
dp[i][2] 前缀i不包含子序列har的最小代价
dp[i][3] 前缀i不包含子序列hard的最小代价
当碰到h的时候,会影响dp[i-1][0] 若删除 转移到dp[i][0] 若不删除 转移到dp[i][1]
当碰到a的时候,会影响dp[i-1][1] 若删除 转移到dp[i][1] 若不删除 转移到dp[i][2]
...
cfedu57D
链接
题意
给你一个长度为n的字符串,每个点有一个删除的代价,问让字符串中不存在子序列hard的最小删除代价。1<=n<=1e5
题解
设:dp[i][0] 前缀i不包含子序列h的最小代价
dp[i][1] 前缀i不包含子序列ha的最小代价
dp[i][2] 前缀i不包含子序列har的最小代价
dp[i][3] 前缀i不包含子序列hard的最小代价
当碰到h的时候,会影响dp[i-1][0] 若删除 转移到dp[i][0] 若不删除 转移到dp[i][1]
当碰到a的时候,会影响dp[i-1][1] 若删除 转移到dp[i][1] 若不删除 转移到dp[i][2]
...
hdu1517
转移自老blog
(1 <= n <= 10000)
sg[ 2] change 1
sg[ 10] change 0
sg[ 19] change 1
sg[ 163] change 0
sg[ 325] change 1
sg[2917] change 0
sg[5833] change 1
win[2:9]=1
win[10:18]=0
win[19:162]=1
win[163:324]=0
win[325:2916]=1
win[2917:5832]=0
win[5833:??]=1
>>> 162*2
324
>>> 2916*2
5832
>>> 324*9
2916
>>>
sg打表 猜测区间端点 *2 与 *9
hdu1517
链接
题意
从1出发,每个人可以选择让这个数乘以2~9中的一个数字,第一个得到大于n的人胜(1 <= n <= 10000)
题解
sg[ 2] change 1
sg[ 10] change 0
sg[ 19] change 1
sg[ 163] change 0
sg[ 325] change 1
sg[2917] change 0
sg[5833] change 1
win[2:9]=1
win[10:18]=0
win[19:162]=1
win[163:324]=0
win[325:2916]=1
win[2917:5832]=0
win[5833:??]=1
>>> 162*2
324
>>> 2916*2
5832
>>> 324*9
2916
>>>
sg打表 猜测区间端点 *2 与 *9