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



京公网安备 11010502036488号