题意:给定n个操作,每个操作有两种:
1)add x 把x添加到数列中,这个数列的结果是递增的,添加过后输出中间值,如果是偶数的话就输出中间两个数之和的平均值。
2)remove x 把x从数列中删掉一个,如果数列是空的或者数列中不存在这个值,输出Wrong!如果存在这个数,删去过后数列为空就输出Empty!否则输出中间值,如果是偶数的话就输出中间两个数之和的平均值。
做法:
可以使用multiset,使用这个的话要维护一个multiset迭代器。
可以使用vector+二分插入,输出时直接输出就行。
注:cout会TLE的。。printf是可以过的。。
详情代码:
代码1:
#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; if(ans%2==0)printf("%lld\n",ans/2); else printf("%.1lf\n",(double)ans/2.0); } } } return 0; }
|
代码2:
#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; }
|