(File IO): input:swap.in output:swap.out
时间限制: 1000 ms 空间限制: 262144 KB 具体限制
Goto ProblemSet
题目描述
F a r m e r J o h n Farmer John FarmerJohn 的 N N N 头奶牛 ( 1 ≤ N ≤ 1 0 5 ) (1≤N≤10^5) (1≤N≤105)站成一排。对于每一个 1 ≤ i ≤ N 1≤i≤N 1≤i≤N,从左往右数第 i i i头奶牛的编号为 i i i。 F a r m e r J o h n Farmer John FarmerJohn 想到了一个新的奶牛晨练方案。他给奶牛们 M M M 对整数 ( L 1 , R 1 ) … ( L M , R M ) (L1,R1)…(LM,RM) (L1,R1)…(LM,RM),其中 1 ≤ M ≤ 100 1≤M≤100 1≤M≤100。他让她们重复以下包含 M M M 个步骤的过程 K ( 1 ≤ K ≤ 1 0 9 ) K(1≤K≤10^9) K(1≤K≤109)次:
对于从 1 1 1 到 M M M 的每一个步骤i:当前从左往右数在位置 L i … R i Li…Ri Li…Ri 的奶牛序列反转她们的顺序。
当奶牛们重复这一过程 K K K 次后,请对每一个 1≤i≤N 输出从左往右数第 i i i 头奶牛的编号。
输入 输出 样例输入 样例输出 数据范围限制 提示 解题思路 代码
输入的第一行包含 N , M N, M N,M 和 K K K。对于每一个 1 ≤ i ≤ M 1≤i≤M 1≤i≤M,第 i + 1 i+1 i+1 行包含 L i Li Li和 R i Ri Ri,均为范围在 1 … N 1…N 1…N 内的整数,其中 Li
在第 i i i 行输出指令序列执行了 K K K 次后奶牛序列中从左往右数第 i i i个元素的编号。
7 2 2
2 5
3 7
1
2
4
3
5
7
6
测试点 1 − 2 1-2 1−2 满足 N = K = 100 N=K=100 N=K=100。
测试点 3 − 5 3-5 3−5 满足 K ≤ 1 0 3 K≤10^3 K≤103。
测试点 6 − 10 6-10 6−10 没有额外限制。
初始时,奶牛们的顺序从左往右为 [ 1 , 2 , 3 , 4 , 5 , 6 , 7 ] [1,2,3,4,5,6,7] [1,2,3,4,5,6,7]。在这一过程的第一步过后,顺序变为 [ 1 , 5 , 4 , 3 , 2 , 6 , 7 ] [1,5,4,3,2,6,7] [1,5,4,3,2,6,7]。在这一过程的第二步过后,顺序变为 [ 1 , 5 , 7 , 6 , 2 , 3 , 4 ] [1,5,7,6,2,3,4] [1,5,7,6,2,3,4]。再重复这两个步骤各一次可以得到样例的输出。
对于初始的序列 1 − N 1-N 1−N 我们可以把它看作数组的位置下标,那么每次操作不就是调换位置,不用管此时在这个位置上的数,也就是我们只要得出进行 M 次操作后第 i i i 位会换到的位置并标记,每一轮结束后就只用调位置就行了,不用再模拟一遍 M M M 。
初始序列为 1 , 2 , 3 , 4 , 5 , 6 , 7 1,2,3,4,5,6,7 1,2,3,4,5,6,7
先处理出进过 M M M 次得出的序列为 1 , 5 , 7 , 6 , 2 , 3 , 4 1,5,7,6,2,3,4 1,5,7,6,2,3,4
可以得出 1 − > 1 , 2 − > 5 , 3 − > 6 , 4 − > 7 , 5 − > 2 , 6 − > 4 , 7 − > 3 1->1,2->5,3->6,4->7,5->2,6->4,7->3 1−>1,2−>5,3−>6,4−>7,5−>2,6−>4,7−>3
上面的数字全都代表数组下标,比如下标 2 2 2上的数变到了下标 5 5 5上
那么第二轮就是 1 , 5 , 7 , 6 , 2 , 3 , 4 1,5,7,6,2,3,4 1,5,7,6,2,3,4 中,位置 1 1 1上的数不变,
位置 2 2 2上的数到了位置 5 5 5,位置 3 3 3上的数到了位置 6 6 6……
则最后序列就变为 1 , 2 , 4 , 3 , 5 , 7 , 6 1,2,4,3,5,7,6 1,2,4,3,5,7,6
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<set>
using namespace std;
int l,r,a[100010],b[100010],c[100010];
int n,m,k;
int main()
{
freopen("swap.in","r",stdin);
freopen("swap.out","w",stdout);
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;i++)
a[i]=i;
while(m--){
cin>>l>>r;
for(int i=l;i<=r;i++)
b[i]=a[l+r-i];
for(int i=l;i<=r;i++)
a[i]=b[i];
}
for(int i=1;i<=n;i++){
c[i]=a[i];
a[i]=i;
}
while(k>0){
if(k&1){
for(int i=1;i<=n;i++)
a[i]=c[a[i]];
}
for(int i=1;i<=n;i++)
b[i]=c[c[i]];
for(int i=1;i<=n;i++)
c[i]=b[i];
k/=2;
}
for(int i=1;i<=n;i++)
printf("%d\n",a[i]);
return 0;
}