dutoj1007圆桌会议

 

Description

某班同学将要在圆桌上召开一次班会。圆桌上分布着3n3n个座位,顺时针编号依次为0,1,…,3n−10,1,…,3n−1,编号相邻的两个座位也相邻,特殊地,3n−13n−1和00也相邻。每个座位上坐着一位同学,每个同学也有一个整数编号XX。现在为了使会议更有趣。参加会议的人们决定进行一些座位调整。一共有两种调整规则如下:
11 aa:同学们顺时针移动aa个座位(aa为负数则逆时针移动)。举例:a=1a=1时,编号为ii的座位上的同学移动到编号为i+1i+1的座位上,特殊情况是编号为3n−13n−1的同学移动到编号为00的座位上。
22:从编号为0的座位开始,每相邻三个座位上的同学顺序颠倒一下。举例:n=2n=2时,座位上依次坐着编号为a0,a1,a2,a3,a4,a5a0,a1,a2,a3,a4,a5的同学,即编号为i的座位上坐着编号为ai的同学。经过该操作后,同学编号依次为a2,a1,a0,a5,a4,a3a2,a1,a0,a5,a4,a3。也就是说,将相邻三个座位上第一个和最后一个同学位置进行调换。
一共进行qq上述操作,最终请从座位00开始顺时针依次输出同学的编号。

 

 

Input

第一行输入nn和q(1≤n,q≤100000)q(1≤n,q≤100000),第二行输入3n3n个数字,表示从座位00到座位3n−13n−1上同学的编号序列,接下 来有qq行输入,每行输入11 a(−100000≤a≤100000)a(−100000≤a≤100000)或22,表示进行一次座位调整操作,操作含义详见题目描述。

Output

一行输出nn个数字,表示从座位00开始顺时针得到的同学编号。

Sample Input

2 3
1 -1 2 -2 3 -3
1 4
2
1 2

Sample Output

1 -3 3 -2 2 -1

 

 

 

通过分成三个小组,然后控制每个小组的上升或者下降匹配头的位置。

#include<stdio.h>



int a[4][35000];
int rank[4]={
0,1,2,0
};
int up[4]={
0,0,0,0
};

int main()
{
int i,j,k,n,q,qi,chi,headx,heady,len,nowrank,temp;
scanf("%d %d",&n,&q);
for(i=0;i<n;i++)
{
scanf("%d",&a[0][i]);
scanf("%d",&a[1][i]);
scanf("%d",&a[2][i]);
}
int head=0;
for(qi=0;qi<q;qi++)
{
scanf("%d",&chi);
if(chi==1)
{
scanf("%d",&len);
head=(head-(len%(3*n))+3*n)%(3*n);
}
else if(chi==2)
{
nowrank=head%3;
temp=rank[(nowrank+2)%3];
rank[(nowrank+2)%3]=rank[nowrank];
rank[nowrank]=temp;
if(nowrank+2>=3)
{
up[rank[nowrank]]=(up[rank[nowrank]]+1)%(3*n);
up[rank[nowrank-1]]=(up[rank[nowrank-1]]-1+3*n)%(3*n);
}
}
}
for(i=head;i<head+3*n-1;i++)
{
printf("%d ",a[rank[i%3]][(up[rank[(i%3)]]+i/3)%n]);
}
printf("%d\n",a[rank[(head+3*n-1)%3]][(up[rank[((head+3*n-1)%3)]]+(head+3*n-1)/3)%n]);
return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值