C++-揷入排序 解题思路

【Horn Studio】编程专栏: 揷入排序  解题思路

题目(由于数学公式显示问题,我们将入口临时切换为网站)

佐助题库 (12345code.com)

思路

这道题不管二分的事情……

a[i]排序后的新下标=数组中上比a[i]小的数的个数+a[i]前面值和a[i]的值相等的数的个数+1
a[j]<a[i],a[j]对a[i们]的新下标有一个1的贡献
j<i,a[j]=a[i],a[j]对a[]的新下标有一个1的贡献
a[i]排序后的下标是是根据和其他值的相对位置和大小决定
假设我修改了a[x],pos数组只会被旧的a[x]和新的a[x]影响
而不需要考虑其他值

op需要分类讨论,就是1与2的情况:1就是计算贡献值,2就是输出其中的贡献结果。在网上的代码又长又臭,还用了一些神奇的算法(线段树,dp………………)数不胜数,我们肯定不用这种办法,所以,便有一个很esay的什么算法都不需要的,就此摆在这里。我感觉这个是目前为止最好的程序。

代码

 

#include<bits/stdc++.h>
using namespace std;
int n,q,a[10005],pos[10005],op,x,v; 
int main(){
    scanf("%d%d",&n,&q);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(i==j) continue;
            if(a[j]<a[i]) pos[i]++;
            if(j<i&&a[i]==a[j]) pos[i]++;
        }
    }while(q--){
        scanf("%d",&op);
        if(op==1){
            scanf("%d%d",&x,&v);
            pos[x]=0;
            for(int i=1;i<=n;i++){
                if(i==x) continue;
                if(a[x]<a[i]) pos[i]--;
                if(i>x&&a[x]==a[i]) pos[i]--;
                if(a[i]>v) pos[i]++;
                if(i>x&&a[i]==v) pos[i]++;
                if(a[i]<v) pos[x]++;
                if(i<x&&a[i]==v) pos[x]++;
            }a[x]=v;
        }else{
            scanf("%d",&x);
            printf("%d\n",pos[x]+1);
        }
    }return 0;
}

彩蛋

 

hahahahahahahahahahhahahahahahahahahhahahahahahahahhahahahahahahahahhahahahahahahahahaha......

posted @ 2022-05-21 21:37  冯子坤  阅读(63)  评论(0编辑  收藏  举报