1 solutions
-
0
C++ :
#include<iostream> using namespace std; #define N 10010 /*p[i]表示排序后i位置的数在原数组p[i]位置 np[i]表示原数组i位置的数在排序后的数组np[i]*/ int a[N],p[N],np[N],n,q; //向前调整 void forward(int k){ for(int i=k;i>1&&a[i]<=a[i-1];i--){ //如果相等,需要判断原来位置的前后关系,从而保证插入排序的稳定性,即原来在前的还是在前 if(a[i]==a[i-1]&&p[i]>p[i-1]){ continue; } swap(a[i], a[i-1]); np[p[i]]=i-1; np[p[i-1]]=i; swap(p[i],p[i-1]); } } //向后调整 void backward(int k){ for(int i=k;i<n&&a[i]>=a[i+1];i++){ //如果相等,需要判断原来位置的前后关系,从而保证插入排序的稳定性,即原来在后面的还是在后面 if(a[i]==a[i+1]&&p[i]<p[i+1]){ continue; } swap(a[i],a[i+1]); np[p[i]]=i+1; np[p[i+1]]=i; swap(p[i],p[i+1]); } } int main(){ cin>>n>>q; for(int i=1;i<=n;i++){ scanf("%d",&a[i]); np[i]=p[i]=i; } //插入排序 for(int i=2; i<=n;i++){ forward(i); } while(q--){ int op,x,v; scanf("%d%d", &op, &x); if(op == 1){ scanf("%d",&v); int k=np[x]; a[k]=v; //更新后,向前或向后进行调整 forward(k); backward(k); } else{ printf("%d\n", np[x]); } } }
- 1
Information
- ID
- 9127
- Time
- 1000ms
- Memory
- 512MiB
- Difficulty
- (None)
- Tags
- # Submissions
- 0
- Accepted
- 0
- Uploaded By