JZOJ.5234【NOIP2017模拟8.7】外星人的路径

Description

有一个外星人控制了你的大脑。一开始你处于原点(0,0)。外星人有一个由(R,U,D,L)组成的长度为M 的操作序列,分别代表(右,上,下,左)。
平面上有N 个关键点,每当外星人给出一个操作,你需要在这个方向上找到最近的一个关键点,并走到那个点上。保证输入数据合法。

上图为第三个样例的图示。
 

Input

第一行两个整数N,M。
接下来N 行,每行两个整数xi,yi,代表第i 个点的坐标。
接下来一行,一个长度为M 的字符串,代表操作序列。

Output

一行两个整数,代表最终你所处的位置。
 

Sample Input

输入1:
4 4
1 1
1 0
0 1 
0 0
RULD

输入2:
7 5
0 0
0 1
0 -1
1 0
1 -1
3 0
3 -1
DRRUD

输入3:
10 6
0 0
1 1
2 1
0 2
-1 2
-1 3
2 3
2 4
4 3
2 -1
ULURDL

Sample Output

输出1:
0 0

输出2:
3 -1

输出3:
1 1
 

Data Constraint

56%的数据,N≤3000,M≤3000。
100%的数据,N,M≤100000,xi,yi≤200000。

 两次快排记录一下每个点上下左右能到哪个点就好了...

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cstdlib>
 6 #include<cmath>
 7 using namespace std;
 8 struct data{
 9     int x,y,z;
10 }po[100005];
11 int n,m,f[100002][5],a;
12 string qwq;
13 bool comp1(const struct data a,const struct data b){
14     if (a.x<b.x) return 1;
15     if (a.x==b.x) if (a.y<b.y) return 1;
16     return 0;
17 }
18 bool comp2(const struct data a,const struct data b){
19     if (a.y<b.y) return 1;
20     if (a.y==b.y) if (a.x<b.x) return 1;
21     return 0;
22 }
23 int main(){    
24     freopen("tratincice.in","r",stdin);
25     freopen("tratincice.out","w",stdout);
26     scanf("%d%d",&n,&m);
27     int x,y;
28     for (int i=1;i<=n;i++){
29         scanf("%d%d",&po[i].x,&po[i].y);
30         po[i].z=i;
31         if ((po[i].x==0)&&(po[i].y==0)) a=i;
32     }
33     cin>>qwq;
34     sort(po+1,po+1+n,comp1);
35     for (int i=1;i<=n;i++){
36         if ((po[i].x==po[i-1].x)&&(po[i].y<po[i-1].y)) {f[po[i].z][0]=po[i-1].z; f[po[i-1].z][1]=po[i].z;}
37         if ((po[i].x==po[i-1].x)&&(po[i].y>po[i-1].y)) {f[po[i].z][1]=po[i-1].z; f[po[i-1].z][0]=po[i].z;}
38     }
39     sort(po+1,po+1+n,comp2);
40     for (int i=1;i<=n;i++){
41         if ((po[i].y==po[i-1].y)&&(po[i].x<po[i-1].x)) {f[po[i].z][2]=po[i-1].z; f[po[i-1].z][3]=po[i].z;}
42         if ((po[i].y==po[i-1].y)&&(po[i].x>po[i-1].x)) {f[po[i].z][3]=po[i-1].z; f[po[i-1].z][2]=po[i].z;}
43         
44     }
45     for (int i=0;i<m;i++){
46         x=(int)qwq[i]-(int)'A';
47         if (x==17) a=f[a][2];
48         else if (x==20) a=f[a][0];
49         else if (x==3) a=f[a][1];
50         else if (x==11) a=f[a][3];
51     }
52     for (int i=0;i<=n;i++)
53     if (po[i].z==a){
54         printf("%d %d",po[i].x,po[i].y);
55         return 0;
56     }
57 }
神奇的代码

 

posted @ 2017-08-07 19:20  ~Lanly~  阅读(298)  评论(0编辑  收藏  举报