题目: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 ",s[i].min,s[i].max); return 0; }