NYOJ 511 移动小球

          一道简单题,用数组模拟链表即可。。。。开始wa了一次,主要是有些边界条件没有考虑好,改过后就ac了。。。。。题目:

移动小球

时间限制:1000 ms  |  内存限制:65535 KB
难度:2
描述
给你n个小球,从左到右编号依次为1,2,3,4,5,6.........n,并规定小球1的左边的球号为n,小球n的右边的球号为1.现在有以下3种操作:A x y表示把编号为x小球移动到编号为y的小球的左边,B x y表示把编号为x小球移动到编号为y的小球的右边,Q 1 m为询问编号为m的小球右边的球号,Q 0 m为询问编号为m的小球左边的球号。
输入
第一行有一个整数n(0<n<10000),表示有n组测试数据,随后每一组测试数据第一行是两个整数N,M,其中N表示球的个数(1<N<10000),M表示操作的的次数(0<M<10000)
随后的M行,每行有三个数 s x y,s表示操作的类型,x,y为小球号。当s为Q时,若x为1,则询问小球y右边的球号,x为0,则询问小球y左边的球号。
输出
输出每次询问的球号
样例输入
1
6 3
A 1 4
B 3 5
Q 1 5
样例输出
3
ac代码:

#include <iostream>
#include <string.h>
#include <cstdio>
using namespace std;
const int N=10010;
int value[N],leftt[N],rightt[N],n,m;
void init(){
	for(int i=1;i<=n;++i){
	   value[i]=i;
	   leftt[i]=i-1;
	   rightt[i]=i+1;
	}
	leftt[1]=n;rightt[n]=1;
}
int main(){
	//freopen("1.txt","r",stdin);
	//freopen("2.txt","w",stdout);
	int numcase;
	scanf("%d",&numcase);
	while(numcase--){
	  scanf("%d%d",&n,&m);
	  init();
	  char ch;
	  int a,b;
	  while(m--){
	    cin>>ch>>a>>b;
		if(ch=='A'){
		  if(rightt[a]==b&&leftt[b]==a)continue;
		  int lefta=leftt[a];
		  int righta=rightt[a];
		  int leftb=leftt[b];
		  rightt[lefta]=righta;
		  leftt[righta]=lefta;
		  rightt[leftb]=a;
		  leftt[b]=a;
		  rightt[a]=b;
		  leftt[a]=leftb;
		}
		else if(ch=='B'){
		  if(leftt[a]==b&&rightt[b]==a)continue;
		  int lefta=leftt[a];
		  int righta=rightt[a];
		  int rightb=rightt[b];
		  rightt[lefta]=righta;
		  leftt[righta]=lefta;
		  leftt[rightb]=a;
		  rightt[b]=a;
		  leftt[a]=b;
		  rightt[a]=rightb;
		}
		else if(ch=='Q'){
		  if(a==1)
			  printf("%d\n",rightt[b]);
		  else
			  printf("%d\n",leftt[b]);
		}
	  }
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值