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......