CodeForces - 1293D Aroma's Search(暴力)

题目链接:点击查看

题目大意:给出一个无限大小的二维平面坐标系,现在给出一系列数据点,给出的形式是给出(x[0],y[0]),再规定可以使用递推式x[i]=ax*x[i-1]+bx,y[i]=ay*y[i-1]+by,现在问,若给出起点为(sx,sy),可以进行上下左右的移动,每次移动消耗一次步数,问在步数不超过 k 次的情况下,最多能经过多少个数据点,注意一个数据点经过多次也只算一次

题目分析:这个题目有一个很关键的细节,就是ax和ay大于等于2,再加上步数小于等于1e16,在这两个条件的约束下,可以做出贡献的点数最多是小于64个的,因为2^64>1e18,这样一来我们就可以预处理出这60多个点,然后暴力,两层for循环确定起点和终点,每次走相邻两个点时的距离为其曼哈顿距离时可以保证最优,这样实时更新最大值就好了

有个比较麻烦的细节就是题目中的数据范围控制不好就会爆longlong,上面提到的,有贡献的点必须满足x和y小于等于一个limit,这个limit开大了开小了都会Wa,差不多2e16是可以AC的

代码:

#include
#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
 
typedef long long LL;
 
const int inf=0x3f3f3f3f;
 
const int N=1e5+100;
 
const LL limit=2e16;
 
struct Node
{
	LL x,y;
	Node(LL X,LL Y)
	{
		x=X;
		y=Y;
	}
};
 
LL dis(Node a,Node b)
{
	return llabs(a.x-b.x)+llabs(a.y-b.y);
}
 
int main()
{
//	freopen("input.txt","r",stdin);
//	ios::sync_with_stdio(false);
	LL x0,y0,ax,ay,bx,by,xs,ys,t;
	cin>>x0>>y0>>ax>>ay>>bx>>by>>xs>>ys>>t;
	LL x=x0,y=y0;
	Node start=Node(xs,ys);
	vectornode;
	while(x<=limit&&y<=limit)
	{
		node.push_back(Node(x,y));
		x=x*ax+bx,y=y*ay+by;
	}
	int ans=0;
	for(int st=0;st

 

你可能感兴趣的:(暴力,CodeForces上分)