XDOJ1109 - 破解密码

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值