CF538G
不知道在哪里找到的题,感觉评不到黑,不过是 Good Tea.
首先了解将坐标系翻转 的 trick ,对于每个坐标 ,翻转后的坐标为 ,这样的话, 和 坐标是互相独立的,不会有关联。
我知道了这个之后然后竟然想出了一道 \*3100?
考虑没有循环的情况怎么做。我们将所有的限制按照时间排序,第 个限制可以满足仅当 到 在每个坐标轴上的距离 ,且距离与时间的奇偶性相同。
显然奇偶性无关循环,可以先单独判断掉,所以只需要考虑有循环的情况下的距离限制。
对于每个 ,我们都可以将它表示为 的形式,含义为走完了 次完整的循环,在最新的一次循环中走到了第 个。我们设一次完整的循环的位移为 。显然如果有多个 是相同的,那就可以确定 了。
对于剩下的情况,显然有式子 。上句的 , 表示在循环 次, 时刻的位置。对于 相邻的两个限制 和 ,我们就可以列出不等式 ,代入,可以得到一些关于 的一次不等式组。
得到 的范围后,就可以任取一组**符合奇偶性**的进行构造了。我们按照 从小到大逐个构造,因为两个点的距离和时间都是确定的,所以有多少个 和 都能确定了。
这道题思路挺清新,主要是代码写起来比较麻烦。
为了方便,可以增加一组限制,在 时坐标在 。
同时需要注意不等式的上取整与下取整问题。
```cpp
#include<bits/stdc++.h>
#define SP system("pause")
using namespace std;
typedef long long lld;
const int maxn=2e6+800;
const lld INF=2e6;
int n,m;int fuck=0;
struct node{lld t,k,r,x,y;} q[2*maxn],fin;
bool operator<(node a,node b) {return a.r<b.r;}
bool operator==(node a,node b){return (a.x==b.x&&a.y==b.y);}
node mi(node a,lld k,node b)
{return (node){a.t,a.k,a.r,a.x-k*b.x,a.y-k*b.y};}
void efs(){printf("NO\n");exit(0);}
lld xl=-INF,xr=INF,yl=-INF,yr=INF;
lld d1v(lld a,lld b) {return ((a<0&&a%b)?a/b-1:a/b);}
//取下整
int mx[maxn],my[maxn],sx[maxn],sy[maxn];
lld nev(lld x){return (x%2?x+1:x);}//next even
lld neo(lld x){return (x%2?x:x+1);}//next odd
char ssh(int x,int y)
{
if(x==+1&&y==+1) return 'R';
if(x==+1&&y==-1) return 'U';
if(x==-1&&y==+1) return 'D';
if(x==-1&&y==-1) return 'L';
return 0;
}
void solve(lld a,lld b,lld typ)//形如ax<=b的不等式
{
if(!a&&b<0) efs();
else if(!a) return ;
lld l=-INF,r=INF;
if(a>0) r=d1v(b,a);
else l=-d1v(b,-a);
if(!typ) xl=max(xl,l),xr=min(xr,r);
else yl=max(yl,l),yr=min(yr,r);
if(xl>xr||yl>yr) efs();
}
void costr()
{
for(int i=1;i<=n;i++)
q[i]=mi(q[i],q[i].k,fin);
q[n+1]=fin;
//随便写构造
for(int i=2;i<=n+1;i++)
{
int lp=q[i-1].r+1,rp=(i<=n?q[i].r:m);
for(int j=q[i-1].r+1;j<=rp;j++)
{
if(j-lp+1<=abs(q[i].x-q[i-1].x))
mx[j]=(q[i].x>q[i-1].x?+1:-1);
else mx[j]=(j%2?+1:-1);
if(j-lp+1<=abs(q[i].y-q[i-1].y))
my[j]=(q[i].y>q[i-1].y?+1:-1);
else my[j]=(j%2?+1:-1);
}
}
for(int i=1;i<=m;i++)
printf("%c",ssh(mx[i],my[i]));
printf("\n");
exit(0);
}
int main()
{
freopen("CF538G.in","r",stdin);
scanf("%d%d",&n,&m);n++;
q[1]=(node){0ll,0ll,0ll,0ll,0ll};
for(int i=2;i<=n;i++)
{
lld t,x,y;scanf("%lld%lld%lld",&t,&x,&y);
q[i]=(node){t,t/m,t%m,x+y,x-y};
}
for(int i=2;i<=n;i++)
{
lld dx=(q[i].x-q[i-1].x)%2;dx=(dx<0?-dx:dx);
lld dy=(q[i].y-q[i-1].y)%2;dy=(dy<0?-dy:dy);
lld dt=(q[i].t-q[i-1].t)%2;dt=(dt<0?-dt:dt);
if(dx!=dt||dy!=dt) efs();
}
sort(q+1,q+n+1);
int fid=0;
for(int i=2;i<=n;i++)
{
lld dk=-q[i].k+q[i-1].k,dt=q[i].r-q[i-1].r;
lld dx=q[i].x-q[i-1].x,dy=q[i].y-q[i-1].y;
if(q[i].r==q[i-1].r)
{
node fcx=(node){0,0,0,q[i].x-q[i-1].x,q[i].y-q[i-1].y};
if(fcx.x%abs(dk)!=0||fcx.y%abs(dk)!=0) efs();
fcx.x/=(-dk),fcx.y/=(-dk);
if(!fid) {fin=fcx;fid=1;}
if(fid&&!(fin==fcx)){efs();}
}
solve(dk,dt-dx,0);solve(-dk,dt+dx,0);
solve(dk,dt-dy,1);solve(-dk,dt+dy,1);
}
//SP;
lld lk=q[n].k+1,lt=m-q[n].r;
lld lx=q[n].x,ly=q[n].y;
solve(lk,lt+lx,0);solve(-lk,lt-lx,0);
solve(lk,lt+ly,1);solve(-lk,lt-ly,1);
if(m%2) xl=neo(xl),yl=neo(yl);
else xl=nev(xl),yl=nev(yl);
if(xl>xr||yl>yr) efs();//SP;
if(fid&&(fin.x<xl||fin.x>xr)) efs();
if(fid&&(fin.y<yl||fin.y>yr)) efs();
if(fid) costr();
fin=(node){0,0,0,xl,yl};
costr();
return 0;
}
```
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界