1 solutions

  • 0
    @ 2024-12-5 18:13:42

    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