CF538G
我不知道我在哪里找到这个问题的,但我不认为它是黑色的。只是好茶。
首先,了解将坐标系翻转45美元的技巧。对于$(x,y)$,翻转的坐标是$(x,y,x-y)$。这样,$x$和$y$的坐标相互独立,不会有关联。
在我知道这些之后,我实际上想出了一个\*3100。
考虑如果没有周期怎么办。我们按时间对所有的限制进行排序,只有当每个坐标轴上$i-1$到$i$的距离为$\leq t_i-t_{i-1}$,并且距离和时间的奇偶性相同时,$i$ th限制才能满足。
显然,宇称与周期无关,可以先分开判断,只需要考虑有周期时的距离限制。
对于每一个$t$,我们可以用$ t=k \乘以l r$的形式来表示,这意味着我们已经完成了$k$个完整的循环,并且在最新的循环中达到了$r$ th。我们假设一个完整周期的位移是$(X,Y)$显然,如果不止一个$r$是相同的,那么$(X,Y)$就可以确定。
对于其余的情况,显然有公式$ (p _ {r},q _ r)=(x _ i,y _ I)-k \u次(x,y) $上一句中的$ p _ r $和$ q _ r $表示$0$次和$r$的位置。对于两个相邻的$r$ $i$和$i'$,我们可以列出不等式$ (p _ r,q _ r)-(p _ {r'},q _ {r'}) \ leqt _ I-t _ {I'} $,并通过代换得到一些。
在得到$(X,Y)$的范围后,可以构造任意一组* *奇偶性* *。我们按照$r$从小到大逐一构造,因为两点的距离和时间是确定的,所以可以确定1$和$-1$的多少。
这个问题的思路挺新鲜的,主要是代码写起来比较麻烦。
为了方便起见,可以添加一组限制。当$t=0$,坐标为$(x,y)=(0,0)$。
同时要注意不平等的向上舍入和向下舍入问题。
` `` cpp
#includebits/stdc。h
#定义服务点系统(“暂停”)
使用命名空间标准;
typedef long long lld
const int maxn=2e6 800
const lld INF=2e6
int n,m;int hook=0;
结构节点{lld t,k,r,x,y;} q[2*maxn],fin
bool运算符(节点a,节点b){ return a . Rb . r;}
bool运算符==(节点a,节点b){ return(a . x==b . xa . y==b . y);}
节点mi(节点a,lld k,节点b)
{return (node){a.t,a.k,a.r,a.x-k*b.x,a . y-k * b . y };}
void EFS(){ printf(' NO \ n ');退出(0);}
lld xl=-INF,xr=INF,yl=-INF,yr=INF
lld d1v(lld a,lld b){ return((a0a % b)a/B- 1: a/b);}
//去掉整体
int mx[maxn],my[maxn],sx[maxn],sy[maxn];
lld nev(lld x){ return(x % 2x 1: x);}//下一晚上
lld neo(lld x){ return(x % 2x : x 1);}//下一个奇数
char ssh(int x,int y)
{
if(x==1y==1)返回‘R’;
if(x==1y==-1)返回‘U’;
if(x==-1y==1)返回‘D’;
if(x==-1y==-1)返回' L ';
返回0;
}
Void求解(lld a,lld b,lld典型值)//ax=b形式的不等式
{
if(!ab0)EFS();
else if(!a)返回;
lld l=-INF,r=INF
if(a0) r=d1v(b,a);
else l=-d1v(b,-a);
if(!典型值)xl=最大值(xl,l),xr=最小值(xr,r);
否则yl=max(yl,l),yr=min(yr,r);
if(xlxr | | ylyr)EFS();
}
void costr()
{
for(int I=1;I=n;(一)
q[i]=mi(q[i],q[i]。k,fin);
q[n1]=fin;
//随便写结构。
for(int I=2;I=n ^ 1;(一)
{
int lp=q[i-1]。r 1,RP=(I=NQ[I]. r :m);
for(int j=q[i-1])。R1;j=rpj)
{
if(j-lp 1=abs(q[i])。x-q[i-1]。x))
mx[j]=(q[i]。xq[i-1]。x 1:-1);
else MX[j]=(j % 2 1:-1);
if(j-lp 1=abs(q[i])。y-q[i-1]。y))
我的[j]=(q[i]。yq[i-1]。y 1:-1);
否则我的[j]=(j % 2 1:-1);
}
}
for(int I=1;I=m;(一)
printf('%c ',ssh(mx[i],my[I]);
printf(' \ n ');
退出(0);
}
int main()
{
freopen('CF538G.in ',' r ',stdin);
scanf('%d%d ',n,m);n;
q[1]=(节点){0ll,0ll,0ll,0ll,0ll };
for(int I=2;I=n;(一)
{
lld t,x,y;scanf('%lld%lld%lld ',t,x,y);
q[i]=(节点){t,t/m,t%m,x y,x-y };
}
for(int I=2;I=n;(一)
{
lld dx=(q[i]。x-q[i-1]。x)% 2;dx=(dx0-dx : dx);
lld dy=(q[i]。y-q[i-1]。y)% 2;dy=(dy0-dy: dy);
lld dt=(q[i]。t-q[i-1]。t)% 2;dt=(dt0-dt : dt);
if(dx!=dt||dy!=dt)EFS();
}
排序(q 1,qn1);
int FID=0;
for(int I=2;I=n;(一)
{
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)
{
节点fcx=(节点){0,0,0,q[i]。x-q[i-1]。x,q[i]。y-q[i-1]。y };
if % 28 fcx。x % ABS % 28 dk % 29% 21% 3d % 7c % 7 CFC x . y % 28 dk % 29% 21% 3d % 29% 20 EFS % 28% 29% 3b % 20% 0a % 20 fcx。x % 2f % 28-dk % 29% 2 CFC。y % 2f % 3d % 28-dk % 29% 3b % 0a % 20 if % 28% 21 FID % 29% 20% 7 bfin % 3 dfx
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/153038.html