洛谷蓝题在牛客也只能有1245分
题目很有意思:就是一开始给定10个数,;然后一共有次操作,每次操作交换两个位置的数。然后一共次查询,每次查询重新从第次操作执行到第次操作后的最终序列为什么。
题目的例子:
次操作:
1次操作:1,0,2,3,4,5,6,7,8,9 
2次操作:1,2,0,3,4,5,6,7,8,9 
3次操作:1,2,3,0,4,5,6,7,8,9 
4次操作:2,1,3,0,4,5,6,7,8,9
5次操作:9,1,3,0,4,5,6,7,8,2
第三次查询为结果为9,0,3,2,4,5,6,7,8,1
本来因当是从开始执行操作,但是每次查询都这样肯定会超时
其实就可以当作从第次执行,然后惊奇的发现位置其实已经对应好了
次操作为1,2,0,3,4,5,6,7,8,9 ;把不同的位置对应为
那么就是2=10=2,....,9=9
然后只需要对应到第次操作:9,1,3,0,4,5,6,7,8,2即可
其实是利用置换的可减性,我需要求从第次操作执行到第操作后的序列状态,那么就是直接从第次操作执行到第次操作减去从次操作执行到第次操作,所以相当于从的状态直接转移到第操作的状态。

总代码:
表示从第次操作到第次操作后的状态中,第个位置的数为
#include<bits/stdc++.h>
using namespace std;

#define endl '\n'
#define int long long
#define IOS ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define HelloWorld IOS;


const int N = 1e5 + 10;
int n, m;
int f[N][10];
signed main(){
    HelloWorld;
    
    cin >> n >> m;
    for(int i = 0; i < 10; i ++) f[0][i] = i;
    for(int i = 1; i <= n; i ++){
        for(int j = 0; j < 10; j ++) f[i][j] = f[i - 1][j];
        int pos_l, pos_r; cin >> pos_l >> pos_r;
        swap(f[i][pos_l], f[i][pos_r]);
    }
    while(m --){
        int l, r; cin >> l >> r;
        l --;
        vector<int> last_pos(10);
        for(int i = 0; i < 10; i ++) last_pos[f[l][i]] = i;
        for(int i = 0; i < 10; i ++) cout << last_pos[f[r][i]] << " ";
        cout << endl;
    }
    return 0;
}