TJOI2010中位数

中位数
上面是题目链接。
这一题比较水。
思路非常显然。
用mid查询时,只要返回中间值就行了。
主要就是add操作。
我们肯定不能插在末尾,然后用系统快排,这样只有30分。
那么正确的操作应该是二分。
也是基本的二分,只是在插入上有所独特的处理。
最后在找到位置后,只要将右边的数往右挪一个位置即可。
下面是代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m;
int num[110005];
char c[5];
void half(int a,int l,int r){
    if(l==r){
        for(int i=n;i>=l;i--){
            num[i+1]=num[i];
        }
//      num[l+1]=num[l];
        num[l]=a;
        return;
    }
    int mid=(l+r)>>1;
    if(a<=num[mid]){
//      for(int i=r;i>=mid+1;i--){
//          num[i+1]=num[i];
//      }
        half(a,l,mid);
    }else{
        half(a,mid+1,r);
    }
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&num[i]);
    }
    sort(num+1,num+n+1);
    scanf("%d",&m);
    while(m--){
        scanf("%s",c);
        if(!strcmp(c,"add")){
            int a;
            scanf("%d",&a);
            half(a,1,n);
            n++;
        }else{
            int ind=n%2==0?n/2:n/2+1;
            printf("%d\n",num[ind]);
        }
    }
    return 0;
} 

猜你喜欢

转载自blog.csdn.net/cggwz/article/details/80542883