嘤嘤的子串权值和
考虑枚举左端点跑 d p dp dp,状态 [ i , j ] [i,j] [i,j] 表示当前在字符串第 i i i 位匹配到第 j j j 位。
发现转移方程跟左端点无关,当右端点为 x x x 时,可选的左端点有 x x x 个,当 s i = a s_i=a si=a 时, [ i , 0 ] = [ i − 1 , 0 ] + i [i,0]=[i-1,0]+i [i,0]=[i−1,0]+i 即可。
饮料难题
没想出方程,发现出题人的想法比较巧妙:
k k k 个空瓶子 = 1 1 1 瓶饮料 + 1 1 1 个空瓶子
两边同时减 1,解得:
1 1 1 瓶饮料 = k − 1 k−1 k−1 个空瓶子。
高精除低精有种简便的写法:
#include <bits/stdc++.h>using namespace std;
using LL = long long;const LL kMaxN = 1e5 + 5;string n;
LL k, v, fl; signed main() {cin >> n >> k, k--;for (LL i = 0; i < n.size(); i++) {v = v * 10 + (n[i] - '0');v >= k && (fl = 1), fl && (cout << v / k), v %= k;}
}
除法来喽
数论分块
枚举分子,做整除分块,记录能得到的结果统计最大值,在虚拟机上超时。
正解
暂时不会,空在这里。
学习除法
有个很重要的结论 ⌊ ⌊ a b ⌋ c ⌋ = ⌊ a b c ⌋ \lfloor \frac{\lfloor \frac{a}{b}\rfloor}{c}\rfloor=\lfloor\frac{a}{bc}\rfloor ⌊c⌊ba⌋⌋=⌊bca⌋,这个结论也可以扩展到多个数的情况。
dp,状态 [ i ] [i] [i] 为若干数相乘后至少为 i i i 的最小代价。
首先 [ i ] = min j = i n b j [i] = \min_{j=i}^n b_j [i]=minj=inbj,转移方程 [ i j ] = min ( [ i j ] , [ i ] + [ j ] ) [ij]=\min([ij],[i]+[j]) [ij]=min([ij],[i]+[j])。
容易发现 [ i ] [i] [i] 有单调递增,对于询问 x , y x,y x,y 二分出最小的 v v v 使得 ⌊ x v ⌋ ≤ y \lfloor \frac{x}{v}\rfloor \le y ⌊vx⌋≤y, [ v ] [v] [v] 即为答案。
坏子串
枚举左端点 i i i,对于每个字母出现位置二分出第一个大于等于 i i i 的字母出现位置,下一个位置减一这段区间即为可取答案。
发现区间有重,去重即可。