2410. Swapity Swap

2410. Swapity Swap

題目描述
Farmer John 的 N 頭奶牛(1≤N≤10^5)站成一排。對於每一個 1≤i≤N,從左往右數第 i 頭奶牛的編號爲 i。Farmer John 想到了一個新的奶牛晨練方案。他給奶牛們 M 對整數 (L1,R1)…(LM,RM),其中 1≤M≤100。他讓她們重複以下包含 M 個步驟的過程 K(1≤K≤10^9)次:
對於從 1 到 M 的每一個步驟i:當前從左往右數在位置 Li…Ri 的奶牛序列反轉她們的順序。
當奶牛們重複這一過程 K 次後,請對每一個 1≤i≤N 輸出從左往右數第 i 頭奶牛的編號。

輸入
輸入的第一行包含 N, M 和 K。對於每一個 1≤i≤M,第 i+1 行包含 Li 和 Ri,均爲範圍在 1…N 內的整數,其中 Li<Ri。

輸出
在第 i 行輸出指令序列執行了 K 次後奶牛序列中從左往右數第 i 個元素的編號。

樣例輸入

7 2 2
2 5
3 7

樣例輸出

1
2
4
3
5
7
6

數據範圍限制
測試點 1-2 滿足 N=K=100。
測試點 3-5 滿足 K≤10^3。
測試點 6-10 沒有額外限制。

提示
初始時,奶牛們的順序從左往右爲 [1,2,3,4,5,6,7]。在這一過程的第一步過後,順序變爲 [1,5,4,3,2,6,7]。在這一過程的第二步過後,順序變爲 [1,5,7,6,2,3,4]。再重複這兩個步驟各一次可以得到樣例的輸出。

方法一:
暴力,30%。

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);
using namespace std;
const int MAX=2147483647;
const int N=1e5+5;
int f[N],l[110],r[110],n,m,k;
int main()
{
	//fre(swap);
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1;i<=n;i++) f[i]=i;
	for(int i=1;i<=m;i++) scanf("%d%d",&l[i],&r[i]);
	while(k--)
		for(int i=1;i<=m;i++) 
			for(int j=l[i];j<=(l[i]+r[i]-1)/2;j++) swap(f[j],f[l[i]+r[i]-j]); 		
	for(int i=1;i<=n;i++)	printf("%d\n",f[i]);
	return 0;
}

方法二(快速冪優化):

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);
using namespace std;
const int MAX=2147483647;
const int N=100010;
int a[N],b[N],f[N],n,m,k;
int main()
{
	//fre(swap);
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1;i<=n;i++) a[i]=i;
	for(int i=1;i<=m;i++)
	{
		int l,r;
		scanf("%d%d",&l,&r);
		for(int j=l;j<=(l+r-1)/2;j++) swap(a[j],a[l+r-j]);
	}
	for(int i=1;i<=n;i++) f[i]=a[i],a[i]=i;
	while(k>0)
	{
		if(k&1)
			for(int i=1;i<=n;i++) a[i]=f[a[i]];
		for(int i=1;i<=n;i++) b[i]=f[f[i]];
		for(int i=1;i<=n;i++) f[i]=b[i];
		k/=2;
	}
	for(int i=1;i<=n;i++) printf("%d\n",a[i]);
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章