比赛 USACO银组重赛hhh 评测结果 AAAAAAAAAA
题目名称 Swapity Swapity Swap 最终得分 100
用户昵称 瑆の時間~無盡輪迴·林蔭 运行时间 0.397 s
代码语言 C++ 内存使用 28.92 MiB
提交时间 2020-03-01 18:24:09
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int dp[100001][36];
int V[100001],P[100001];
int Bit[100001],ans[100001];
int n,m,k,a1,a2,cnt=0,jl=0;
int main()
{
	freopen("usaco_Feb_swap.in","r",stdin);
	freopen("usaco_Feb_swap.out","w",stdout);
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1;i<=n;i++)
	{
		V[i]=i;
	}
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&a1,&a2);
		for(int j=a1;j<=(a1+a2)/2;j++)
		{
			swap(V[j],V[a2-j+a1]);//在J位上的牛和在A2-J+A1位上的牛. 
		} 
	}
	for(int i=1;i<=n;i++)
	{
		dp[V[i]][0]=i;
	} 
	for(int i=1;i<=35;i++)
	{
		for(int j=1;j<=n;j++)
		{
			dp[j][i]=dp[dp[j][i-1]][i-1];
		}
	}
	while(k)
	{
		if(k&1)
		{
			Bit[++cnt]=jl;
		}
		jl++;
		k>>=1;
	}
	for(int i=1;i<=n;i++)
	{
		int x=i;
		for(int j=1;j<=cnt;j++)
		{
			x=dp[x][Bit[j]];
		}
		ans[x]=i;
	}
	for(int i=1;i<=n;i++)
	{
		printf("%d\n",ans[i]); 
	}
	return 0;
}