题解:ABC279D-Freefall

题解:ABC279D-Freefall

·题目

链接:Atcoder。

链接:洛谷。

·难度

算法难度:C。

思维难度:A。

调码难度:C。

综合评价:普及+/提高。

·算法

模拟。

·思路

引入3个数组:u(每次操作交换的第一个数)、v(每次操作交换的第二个数)、w(每个数最终的位置)。对于每个s[i],我们分三种情况讨论:

①u[i]=1,输出w[v[i]]。

②v[i]=1,输出w[u[i]]。

③其他情况,输出w[1]。

·代价

O(n+m)。

·细节

没什么。

·代码

#include
#define M 220000
#define N 220000
using namespace std;
int a[M]={},b[N]={},u[M]={},v[M]={},w[M]={},m=0,n=0;
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++){
        scanf("%d",&a[i]);
    }
    for(int i=1;i<=n;i++){
        b[i]=i;
    }
    for(int i=1;i<=m;i++){
        u[i]=b[a[i]];
        v[i]=b[a[i]+1];
        swap(b[a[i]],b[a[i]+1]);
    }
    for(int i=1;i<=n;i++){
        w[b[i]]=i;
    }
    for(int i=1;i<=m;i++){
        if(u[i]==1){
            printf("%d\n",w[v[i]]);
        }else{
            if(v[i]==1){
                printf("%d\n",w[u[i]]);
            }else{
                printf("%d\n",w[1]);
            }
        }
    }
    return 0;
}

·注意

b数组不要忘记初始化。

你可能感兴趣的:(c++,算法,开发语言)