Problem 1109 - 破解密码
/*
Time Limit: 1000MS
Memory Limit: 65536KB
Difficulty:
Total
Submit: 355 Accepted: 131 Special Judge: No
DescriptionSHF是一个很神奇的人,他的电脑也采用了一种奇怪的密码验证方式,即一串数字的某个排列。CX是一个密码破解爱好者,当然对于这种密码很有兴趣。现在他知道SHF的初始密码是(1,2,3,...,N),每次用两个数字A和B来修改密码,也就是把[A,B]位置区间的数字反序,包括A、B位置的数字(A,B以1作为起始编号)。例如,现在的密码是(2,1,3,5,4),密码修改操作的数字是2和5,则修改后的密码为(2,4,5,3,1)。CX已经知道了SHF所有的密码修改操作的序列,但由于操作次数实在太多了,他计算不出最后的密码是什么,现在他需要你帮他计算出最后的密码。
Input输入数据的第一行是一个正整数T(0<T<=10),表示有T组测试数据。
每组测试数据的第一行包含两个整数N,M(0<N<=100000,
0<=M<=2000),表示初始密码为(1,2,3,...,N),共有M次密码修改操作。
接下来有M行,每行有两个整数A,B(0<A<=B<=N),表示进行一次密码修改操作,意义如上所述。Output对于每组测试数据,在一行上输出N个整数,表示最后的密码。整数之间以一个空格隔开。
Sample
Input
2
5 2
1 3
4 5
5 2
1 4
2 5
Sample
Output
3 2 1 5 4
4 5 1 2 3
*/
数组转置题,只要把握好转置函数就可以,注意临界条件。然后就是不要多输出空格。
1 #include<stdio.h> 2 #include<string.h> 3 int s[100010]; 4 void Rev(int s[],int a,int b) 5 { 6 int t,i,j; 7 for(i=a-1,j=b-1;i<=(b+a-2)/2;i++,j--) 8 { 9 t=s[i]; 10 s[i]=s[j]; 11 s[j]=t; 12 } 13 } 14 int main() 15 { 16 int i,j,a,b,T,n,m; 17 scanf("%d",&T); 18 while(T--) 19 { 20 scanf("%d%d",&n,&m); 21 22 for(i=0;i<n;i++) 23 s[i]=i+1; 24 for(j=1;j<=m;j++) 25 { 26 scanf("%d%d",&a,&b); 27 Rev(s,a,b); 28 } 29 printf("%d",s[0]); 30 for(i=1;i<n;i++) 31 printf(" %d",s[i]); 32 printf("\n"); 33 } 34 return 0; 35 }