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 }

 

posted @ 2013-08-10 19:41  hjf007  阅读(334)  评论(0编辑  收藏  举报