3 条题解
-
0
#include<bits/stdc++.h> using namespace std; struct nd{int x,y;}; map<int,nd>a; int main() { int n,q;scanf("%d%d",&n,&q); for(int i=1;i<=n;i++)a[i]={n-i+1,0}; int l=n; while(q--) { int op,p;char c;scanf("%d",&op); if(op==1) { a[l+1]=a[l];l++; cin>>c; if(c=='R')a[l].x++; else if(c=='L')a[l].x--; else if(c=='U')a[l].y++; else a[l].y--; } else { scanf("%d",&p); printf("%d %d\n",a[l-p+1].x,a[l-p+1].y); } } return 0; } -
-1
注意题目未给数据范围,记得定义足够
#include<bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(0); cin.tie(0);cout.tie(0); int n,q;cin>>n>>q; int m=n; struct node{int x,y;}loong[n+q+10]; //n+q是这个代码最多所用的结构体数量,n个部位,q次移位 for(int i=1;i<=n;i++)loong[i]={n-i+1,0};//初始值,存为一条 while(q--) { int a,b;char s; cin>>a; if(a==1)//情况1--移位 { cin>>s; m++;//调整龙头 if(s=='R')loong[m]={loong[m-1].x+1,loong[m-1].y}; else if(s=='L')loong[m]={loong[m-1].x-1,loong[m-1].y}; else if(s=='U')loong[m]={loong[m-1].x,loong[m-1].y+1}; else loong[m]={loong[m-1].x,loong[m-1].y-1}; //题意推导,移动到先前部位的位置,别忘了这个情况要再移动 } else//情况2--输出 { cin>>b; printf("%d %d\n",loong[m-b+1].x,loong[m-b+1].y); } } return 0; } -
-1
按照题意每种情况即可 注意:不开2e6会RE
,别问我是怎么知道的#include<bits/stdc++.h> using namespace std; const int N=2e6+10; struct node{int x,y;}a[N]; int n,q; int main() { scanf("%d%d",&n,&q); for(int i=n;i>=1;i--)a[i]={n-i+1,0}; int sum1=n; while(q--) { int op;scanf("%d",&op); if(op==1)//情况1 { sum1++;//龙头是第几个结构体 char c[2];scanf("%s",c); if(c[0]=='U')a[sum1]={a[sum1-1].x,a[sum1-1].y+1};//每种方向 else if(c[0]=='D')a[sum1]={a[sum1-1].x,a[sum1-1].y-1}; else if(c[0]=='L')a[sum1]={a[sum1-1].x-1,a[sum1-1].y}; else if(c[0]=='R')a[sum1]={a[sum1-1].x+1,a[sum1-1].y}; } else { int x;scanf("%d",&x); printf("%d %d\n",a[sum1-x+1].x,a[sum1-x+1].y);//输出!!! } } return 0;//完结撒花 }
- 1
信息
- ID
- 8264
- 时间
- 2000ms
- 内存
- 1024MiB
- 难度
- 7
- 标签
- 递交数
- 49
- 已通过
- 13
- 上传者