CF538G Berserk Robot

題意:一個機器人在一個無窮大的網格圖中,每秒可以上下左右走一步。它的行走方向序列是長度爲l的循環。給你n個線索,包括ti:時間,xi,yi走到的座標。讓你構造出行走的方向序列?node

 

標程:c++

 1 #include<bits/stdc++.h>
 2 using namespace std;  3 typedef long long ll;  4 const int N=2000005;  5 ll t,x,y,nx,ny;  6 int n,l[N],r[N],len;  7 struct node{ll ty,tz,x;node(){} node(ll A,ll B,ll C){ty=A;tz=B;x=C;}}a[N],b[N];  8 bool operator < (const node &A,const node &B) {return A.ty<B.ty;}  9 ll ceil(ll x,ll y) 10 { 11     if (x<0) x=-x,y=-y; 12     if (x==0) return 0; 13     if (y>0) return (x-1)/y+1; 14     else return x/y; 15 } 16 ll floor(ll x,ll y) 17 { 18    if (x<0) x=-x,y=-y; 19    if (x==0) return 0; 20     if (y>0) return x/y; 21     else return (x-1)/y-1; 22 } 23 void solve(node *a,int *ans) 24 { 25     sort(a+1,a+n+1); 26     ll L=0,R=len; 27     a[n+1]=node(len,-1,0);//設置邊界!!!
28     for (int i=0;i<=n;i++)//要統計入最後一個限制S[len]=0-S*(-1) 
29  { 30         ll d=a[i+1].ty-a[i].ty,q=a[i+1].x-a[i].x,p=a[i].tz-a[i+1].tz; 31         if (p>0) 32  { 33             L=max(L,ceil(-q,p)); 34             R=min(R,floor(d-q,p)); 35         }else if (p<0) { 36             L=max(L,ceil(d-q,p)); 37             R=min(R,floor(-q,p)); 38  } 39         if (L>R||p==0&&(q<0||q>d)) {puts("NO");exit(0);} 40  } 41     ll s=L,si=0; 42     for (int i=0,j=1;i<=n;i++) 43  { 44         si=(a[i+1].x-s*a[i+1].tz)-(a[i].x-s*a[i].tz); 45         while (si--) ans[j++]=1; 46         j=a[i+1].ty+1;//a[i+1]而不是a[i] 
47  } 48 } 49 int main() 50 { 51     scanf("%d%d",&n,&len); 52     for (int i=1;i<=n;i++) 53  { 54         scanf("%lld%lld%lld",&t,&x,&y); 55         nx=x+y+t;ny=x-y+t; 56         if (nx&1) return puts("NO"),0; 57         nx/=2;ny/=2; 58         a[i]=node(t%len,t/len,nx); 59         b[i]=node(t%len,t/len,ny); 60  } 61  solve(a,l); 62  solve(b,r); 63     for (int i=1;i<=len;i++) 64       printf("%c","LDUR"[l[i]<<1|r[i]]);//此題的方向與常識相異! 
65     return 0; 66 }

 

易錯點:1.注意設置l處的邊界,要統計入最後一個限制S[len]=0-S*(-1),不然不等式不完整。spa

2.注意負數和0的上下取整。 code

 

題解:轉換+不等式構造blog

這道題思路很是喵!it

將x,y座標分開考慮,每次x座標+-1,或y座標+-1。難以處理。class

設置(x+y,x-y)爲新的參數,這樣每次兩個參數都會有+-1的變化。循環

再進一步,((x+y+t)/2,(x-y+t)/2)設置,每次要麼+1,要麼+0。統計

——以上是座標和時間結合題的某種套路。sort

以後就是構造合法解的事情了。

這樣對於一系列的t,因爲l是循環節長度,設Sl爲單位循環加了多少個1,S[i]表示i時間內加了多少個1,能夠列出等式S[t%l]=Xi-Sl*[t/l]。

以及由相鄰依次遞增的t%i列出一系列不等式:0<=Sb-Sa<=b-a。總體化成0<=p*Sl+q<=d的形式,能夠解出Sl的取值範圍,取範圍中的任意值皆可。

這樣能夠解出全部S[t%l],直接按區間填上對應數量的1便可。

相關文章
相關標籤/搜索