[置换 前缀和]牛牛的猜球游戏
题目
思路
参考这篇题解 代码很简易,但是感觉还是有点难想到awa
对于广义的前缀和来说,sum[r]就是到第r次操作为止,操作累积造成的影响。接下来思考如何取消前缀置换操作的影响,从而完成区间查询操作。
把置换操作看作映射,可以发现把映射出来的序列再做两次映射后会回到原来的序列,这样相当于取消了第一次映射的影响,考虑如何用代码实现。映射实际上是对序列重新赋值,那么取消前缀操作相当于把第l-1次操作后的序列当作起始序列。
本题前缀和的+和-都表现为重新赋值,等号就实现了映射的过程。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m;
int f[N][10],sum[10];
int main(){
cin>>n>>m;
for(int i=0;i<10;i++) f[0][i]=i;//初始序列为0~9
for(int i=1;i<=n;i++){//记录1~n号操作的量
int a,b;
cin>>a>>b;
for(int j=0;j<10;j++) f[i][j]=f[i-1][j];//f存到第i次操作为止,位置j上的数
swap(f[i][a],f[i][b]);
}
while(m--){
int l,r;
cin>>l>>r;
for(int i=0;i<10;i++) sum[f[l-1][i]]=i;//取消1~l-1的操作
for(int i=0;i<10;i++) printf("%d ",sum[f[r][i]]);
printf("\n");
}
return 0;
}