CF538G

不知道在哪里找到的题,感觉评不到黑,不过是 Good Tea.

首先了解将坐标系翻转 45 的 trick ,对于每个坐标 (x,y),翻转后的坐标为 (x+y,xy),这样的话,xy 坐标是互相独立的,不会有关联。

我知道了这个之后然后竟然想出了一道 \*3100?

考虑没有循环的情况怎么做。我们将所有的限制按照时间排序,第 i 个限制可以满足仅当 i1i 在每个坐标轴上的距离 titi1,且距离与时间的奇偶性相同。

显然奇偶性无关循环,可以先单独判断掉,所以只需要考虑有循环的情况下的距离限制。

对于每个 t,我们都可以将它表示为 t=k×l+r 的形式,含义为走完了 k 次完整的循环,在最新的一次循环中走到了第 r 个。我们设一次完整的循环的位移为 (X,Y)。显然如果有多个 r 是相同的,那就可以确定 (X,Y) 了。

对于剩下的情况,显然有式子 (pr,qr)=(xi,yi)k×(X,Y)。上句的 pr,qr 表示在循环 0 次, r 时刻的位置。对于 r 相邻的两个限制 ii ,我们就可以列出不等式 (pr,qr)(pr,qr)titi,代入,可以得到一些关于 (X,Y) 的一次不等式组。

得到 (X,Y) 的范围后,就可以任取一组**符合奇偶性**的进行构造了。我们按照 r 从小到大逐个构造,因为两个点的距离和时间都是确定的,所以有多少个 +11 都能确定了。

这道题思路挺清新,主要是代码写起来比较麻烦。

为了方便,可以增加一组限制,在 t=0 时坐标在 (x,y)=(0,0)

同时需要注意不等式的上取整与下取整问题。

```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;
}
```

posted @   SS80194  阅读(60)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界
点击右上角即可分享
微信分享提示
主题色彩