题解 CF1292B 【Aroma's Search】
首先,很容易观察到点的一些特征:
- 都在第一象限;
- 点的分布越来越稀疏。
以样例为例:
还有无限个点没有画出来。
根据点的分布越来越稀疏的特性,能不能发现收集点的规律呢?
比如我们可以先枚举一个点
然后呢?如果往
当然,我们往
但是,这边的点是有限的,如果全部收集完了时间还绰绰有余呢?
那就原路返回,再往
有人可能会疑惑,为什么这里都原路返回了,答案还是最优呢?
首先,因为随着
下面为了分析方便只看
点最密集的时候应该是什么时候?很显然,
现在
这说明什么?收集
如果当初选择向右走,那再去收集
还有一个小问题,就是数组开多大,因为
时间复杂度
#include <bits/stdc++.h>
#define max(a, b) a > b ? a : b
typedef long long LL;
const int N = 70;
LL ax, ay, bx, by, ans, n;
LL x[N], y[N], xs, ys, t;
LL dist(LL x1, LL y1, LL x2, LL y2) { return llabs(x1 - x2) + llabs(y1 - y2); }
int main()
{
scanf("%lld %lld %lld %lld %lld %lld", x, y, &ax, &ay, &bx, &by);
scanf("%lld %lld %lld", &xs, &ys, &t);
while(++n)
{
x[n] = ax * x[n - 1] + bx; y[n] = ay * y[n - 1] + by;
if(x[n] > xs && y[n] > ys && dist(xs, ys, x[n], y[n]) > t) break;
}
for(int i = 0; i <= n; i++)
{
LL tans = 0, tt = t;
if(dist(xs, ys, x[i], y[i]) <= tt) tt -= dist(xs, ys, x[i], y[i]), tans++; // S -> Pi
else { ans = max(ans, tans); continue; }
for(int j = i; j; j--) // Pi -> P0
{
if(dist(x[j], y[j], x[j - 1], y[j - 1]) <= tt)
tt -= dist(x[j], y[j], x[j - 1], y[j - 1]), tans++;
else break;
}
for(int j = 1; j <= n; j++) // P0 -> Pi -> P∞
{
if(dist(x[j], y[j], x[j - 1], y[j - 1]) <= tt)
tt -= dist(x[j], y[j], x[j - 1], y[j - 1]), tans += j > i; // 注意 j > i 的时候才能算入
else break;
}
ans = max(ans, tans);
}
printf("%lld\n", ans);
return 0;
}