ZOJ 3612 Median multiset或vector+二分

来源:互联网 发布:美国一年制硕士 知乎 编辑:程序博客网 时间:2024/05/17 23:05

题意:给定n个操作,每个操作有两种:

1)add x 把x添加到数列中,这个数列的结果是递增的,添加过后输出中间值,如果是偶数的话就输出中间两个数之和的平均值。

2)remove x 把x从数列中删掉一个,如果数列是空的或者数列中不存在这个值,输出Wrong!如果存在这个数,删去过后数列为空就输出Empty!否则输出中间值,如果是偶数的话就输出中间两个数之和的平均值。

做法:

可以使用multiset,使用这个的话要维护一个multiset迭代器。

可以使用vector+二分插入,输出时直接输出就行。

注:cout会TLE的。。printf是可以过的。。

详情代码:

代码1:

//First Edit Time:2014-07-16 22:10//Last Edit Time:2014-07-16 22:11#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <set>#include <vector>#include <map>#include <queue>#include <set>#include <algorithm>using namespace std;multiset <int> ss;multiset <int> ::iterator it,mid;char str[10];int main(){    int t,n,x;    scanf("%d",&t);    while(t--){        scanf("%d",&n);        ss.clear();        while(n--){            scanf("%s%d",str,&x);            if(str[0]=='a'){                ss.insert(x);                if(ss.size()==1)mid=ss.begin();                else if(ss.size()%2==0&&*mid<=x)++mid;                else if(ss.size()%2==1&&*mid> x)--mid;            }            else if(str[0]=='r'){                it=ss.find(x);                if(it==ss.end()){                    printf("Wrong!\n");                    continue;                }                if(it != mid){                    if(ss.size()%2==0&&*mid<x)--mid;                    else if(ss.size()%2==1&&*mid>=x)++mid;                }                else {                    if(ss.size()%2==0)--mid;else ++mid;                }                ss.erase(it);                if(ss.empty()){                    printf("Empty!\n");                    continue;                }            }            if(ss.size()%2==1){ printf("%d\n",*mid); }            else {                it=mid;                it--;                long long ans=(long long)*mid+(long long)*it;                //printf("ans:%lld\n",ans);                if(ans%2==0)printf("%lld\n",ans/2);                else printf("%.1lf\n",(double)ans/2.0);            }        }    }    return 0;}
代码2:
//First Edit Time:2014-07-17 00:03//Last Edit Time:2014-07-17 00:03#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <set>#include <vector>#include <map>#include <queue>#include <set>#include <algorithm>using namespace std;typedef long long LL;vector <LL> a;int n;char str[10];int main(){    int t;    scanf("%d",&t);    while(t--){        scanf("%d",&n);        a.clear();        LL x;        for(int i=0;i<n;i++){            scanf(" %s%lld",str,&x);            int pos=lower_bound(a.begin(),a.end(),x)-a.begin();            if(str[0]=='r'){                if(pos>=(int)a.size()||a[pos]!=x){ puts("Wrong!");continue; }                else {                    a.erase(a.begin()+pos);                    if(a.size()==0){ puts("Empty!");continue; }                }            }            else if(str[0]=='a'){                a.insert(a.begin()+pos,x);            }            if(a.size()%2==0){                LL ans=a[a.size()/2]+a[a.size()/2-1];                if(ans%2==0)printf("%lld\n",ans/2);                else printf("%.1lf\n",(double)ans/2.0);            }            else printf("%lld\n",a[a.size()/2]);        }    }    return 0;}



0 0