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
- ZOJ 3612 Median multiset或vector+二分
- ZOJ 3612 Median (multiset)
- ZOJ 3612 Median(二分)
- zoj Median (multiset)
- Median(vector+二分)
- zoj 3612 (multiset)
- zoj 3612 Median(Treap)
- zoj 3612 Median (SBT)
- zoj 3612 Median/sbt
- ZOJ 3908 Number Game (贪心+二分+multiset)
- ZOJ 3612 Median(SBT)
- zoj 3612 Median (splay)
- zoj 3612 ——Median
- ZOJ 3612 && HDU 4864 (multiset 的应用)
- Median---ZOJ
- Median [二分]
- STL学习(multiset Vector)
- zoj 2029【二分查找】或【STL】
- 08.桥接模式--Bridge
- GTK编程基础-----事件驱动(事件盒、固定窗口)
- Linux 常用命令总结(实时更新)
- zoj--2165
- MFC编程学习 ------(1)加法计算器
- ZOJ 3612 Median multiset或vector+二分
- java学习笔记:文件名区分大小写
- PHP工作模型与运行机制
- 说下API 函数SendMessage
- WeChall Training: ASCII
- Android系统源代码学习-三击事件的实现(Android设置界面的三击Android版本弹出logo)
- java基础--Jar包添加到build path方式说明--01
- SupremeWord进度37.4%
- 安卓学习笔记(一) 用适配器适配ListView和ArrayList<HashMap<String,String>>——安卓第二天