官解:Terrorists
前置知识
- DP
- 矩阵加速
算法 1
考虑暴力。对每一天枚举点对,朴素实现 DP 的复杂度为
期望得分
算法 2
不难想到记录能够转移的点对来优化转移。
由于数据随机,转移方案数应该是蛮少的。
可能有点卡常,但确实能过。
期望得分
算法 3
按照算法
考虑矩阵加速,时间复杂度为
期望得分
code
避免有人说算法
int run[105][105];
int tot[105];
inline void Add(int &a, int b){
a += b;
(a >= MOD ? a -= MOD : a);
}
int f[105], lst[105];
int main() {
for (int j = 0; j < m; ++ j) {
for (int k = 0; k < m; ++ k) {
if (persons[j].t <= persons[k].t && persons[j].c >= persons[k].c) {
if (persons[j].g == 'g' || persons[j].l <= persons[k].l) {
run[j][++ tot[j]] = k;
}
}
}
}
while (N --) {
memcpy(lst, f, sizeof(int) * m);
memset(f, 0, sizeof(int) * m);
for (int j = 0; j < m; ++ j) {
for (int p = tot[j]; p;){
Add(f[j], lst[run[j][p --]]);
}
}
}
for (int i = 0; i < m; i++)
Add(ans, f[i]);
}