Description
SHF是一个很神奇的人,他的电脑也采用了一种奇怪的密码验证方式,即一串数字的某个排列。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
解题思路:
需要注意的其实vector.end()指向的最后一个元素的下一个位置。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> passwd;
void print()
{
vector<int>::iterator iter = passwd.begin();
cout<<*iter;
for(++iter;iter!=passwd.end();++iter)
cout<<" "<<*iter;
cout<<endl;
}
int main()
{
int T;
cin>>T;
for(int i=0;i<T;++i)
{
int N,M;
cin>>N>>M;
passwd.clear();
for(int j=1;j<=N;++j)
passwd.push_back(j);
for(int j=0;j<M;++j)
{
int A,B;
cin>>A>>B;
reverse(passwd.begin()+A-1,passwd.begin()+B);
}
print();
}
return 0;
}
最后欢迎大家访问我的个人网站: 1024s