题解:CF2253D
MisserinaAFO · · 题解
第一眼感觉是 P17201 类似物,后来发现差异还是有点大的。
该题解中出现的定义
某个点
形式化题面
飞船最初位置在
- 将
v_x 变为v_x+1 ,然后x 方向前进v_x 单位长度,y 方向前进v_y 单位长度。 - 将
v_y 变为v_y+1 ,然后x 方向前进v_x 单位长度,y 方向前进v_y 单位长度。
构造一种方案,使得飞船全程坐标均在图内且终点离目标点的几何距离最近。
解题思路
不难发现,无论每次怎样操作,每次移动的曼哈顿距离是固定的,即第
在确定操作次数后,可以证明任意一个满足与起点
由函数
- 如果该点不在图内:假设
x 坐标小于0 ,则将y 坐标加上x 坐标的绝对值后将x 坐标变为0 ,y 坐标小于0 时操作类似。 - 如果该点在图内但是坐标不是整数:将
x 坐标与y 坐标一个向上取整一个向下取整即可。
每一次操作,如果这一次操作选择增加
代码如下:
#include <bits/stdc++.h>
using namespace std;
int t,x,y,xx,yy,vx,vy;
int main() {
scanf("%d",&t);
while (t--) {
scanf("%d%d",&x,&y);
int l=1,r=20000;
while (l<=r) {
int mid=(l+r)>>1;
if (mid*(mid+1)/2<=x+y) l=mid+1;
else r=mid-1;
}
//printf("%d %d\n",l,r);
int mn=x+y-(r*(r+1)/2);
int mnx=mn/2;
int mny=mn-mnx;
if (mnx>x) {
mnx=x;
mny=mn-mnx;
}
if (mny>y) {
mny=y;
mnx=mn-mny;
}
x-=mnx;
y-=mny;
//printf("x %d y %d\n",x,y);
xx=0;
yy=0;
vx=0;
vy=0;
for (int i=1;i<=r;i++) {
if (xx+(vx+1)*(r-i+1)<=x) {
printf("X");
vx++;
}
else {
printf("Y");
vy++;
}
xx+=vx;
yy+=vy;
}
printf("\n");
//printf("xx:%d yy:%d\n",xx,yy);
}
}