[置换 前缀和]牛牛的猜球游戏

Posted 鱼竿钓鱼干

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[置换 前缀和]牛牛的猜球游戏相关的知识,希望对你有一定的参考价值。

[置换 前缀和]牛牛的猜球游戏

题目

思路

参考这篇题解
代码很简易,但是感觉还是有点难想到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;
}

以上是关于[置换 前缀和]牛牛的猜球游戏的主要内容,如果未能解决你的问题,请参考以下文章

AcWing 1913. 公平摄影(前缀和+STL)

2020牛客寒假算法基础集训营3——I.牛牛的汉诺塔记忆化

牛牛的背包问题

谈谈Google与微信H5牛牛的Java开发规范

牛牛的闹钟

牛客 - 牛牛的最大兴趣组(思维+数论)