CF-1250A-Berstagram

题目:https://vjudge.net/problem/CodeForces-1250A

分析:开两个数组分别储存数值与位置,交换时将位置和数值一起交换并更新数值的最大最小位置,最后输出。

注意:交换后更新位置时误用交换后的错误值。

 

#include <stdio.h>
int v[400400],p[400400],b[400400];
struct node{
    int min;
    int max;
} s[400400];
void swap(int *a,int *b){
    int z=*a;
    *a=*b;
    *b=z;
}
int main(void){
    int n,m;
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++){
        v[i]=p[i]=s[i].min=s[i].max=i;
    }
    for(int i=1;i<=m;i++)scanf("%d",&b[i]);
    for(int i=1;i<=m;i++){
        int x=b[i];//后数 
        if(p[x]==1)continue;
        int pre=p[x]-1;//前数位置 
        int q=v[pre];//前数
        int r=p[x];//后数位置 
        swap(&v[pre],&v[r]);
        swap(&p[x],&p[q]);
        s[x].min=s[x].min>pre?pre:s[x].min;
        s[q].max=s[q].max>r?s[q].max:r;
    }
    for(int i=1;i<=n;i++)
    printf("%d %d\n",s[i].min,s[i].max);
    return 0;
}

 

posted @ 2020-02-05 21:33  yanying  阅读(228)  评论(0编辑  收藏  举报