JZOJ 2152 终极数
2018-02-01 21:43
337 查看
给定一个长度为n的序列a,试求出对于序列a的每一个前缀的终极数x,使得
最小
首先这道题比较搞事。
一开始还是一脸懵逼的
然后后来发现就是求1——i(i<=n)的中位数,这几个数的中位数
详情看代码解析
最小
首先这道题比较搞事。
一开始还是一脸懵逼的
然后后来发现就是求1——i(i<=n)的中位数,这几个数的中位数
详情看代码解析
#include <cstdio> #include <algorithm> using namespace std; int a[500001],b[500001],c[1000001],n,x; void up1(int x){while (x>1&&a[x]<a[x/2]) swap(a[x],a[x/2]),x/=2;} void up2(int x){while (x>1&&b[x]>b[x/2]) swap(b[x],b[x/2]),x/=2;} void down1(int x){ int y; while (x*2<=a[0]&&a[x]>a[x*2]||x*2+1<=a[0]&&a[x]>a[x*2+1]){ if (x*2+1>a[0]||a[x*2]<a[x*2+1]) y=x*2; else y=x*2+1; swap(a[x],a[y]); x=y;}} void down2(int x){ int y; while (x*2<=b[0]&&b[x]<b[x*2]||x*2+1<=b[0]&&b[x]<b[x*2+1]){ if (x*2+1>b[0]||b[x*2]>b[x*2+1]) y=x*2; else y=x*2+1; swap(b[x],b[y]); x=y;}} int main(){ freopen("c.in","r",stdin); freopen("c.out","w",stdout); scanf("%d",&n); for (int i=1;i<=n;i++){ scanf("%d",&x); if (i%2) a[++a[0]]=x,up1(a[0]);//先插入小根堆 else b[++b[0]]=x,up2(b[0]);//再插入大根堆 while (a[1]<b[1]) swap(a[1],b[1]),down1(1),down2(1);//小根堆的堆顶比大根堆的堆顶大就交换,并维护两个堆 c[i]=a[1];//中位数 } sort(c+1,c+1+n); printf("%d",c[n/2]); return 0;//快排后正中间的输为中位数 }
相关文章推荐
- IIS可以访问HTML但访问不了ASP(终极解决之道)! .
- maven项目 jre system library 1.5-->1.7,或者是任意版本,终极解决方案!!
- 关于百度蜘蛛在WEB 日志下留 200 0 64 的终极解答 纠正网上的谬论
- JavaScript 汉字与拼音互转终极方案 附JS拼音输入法
- Jzoj1951 布娃娃
- JqueryMobile使用心得(4)动态添加元素css丢失的终极解决办法
- 【JZOJ3598】【CQOI2014】数三角形
- Jzoj3591 数据
- SRS Audio Sandbox(终极的音频增强软件)
- 【JZOJ3640】【COCI2014】utrka
- Jzoj5542 董先生的钦点
- JSP中文乱码问题终极解决方案
- Bzoj 2152: 聪聪可可(点分治)
- jzoj1498. 抓猫
- ruby + tk 是快速GUI开发的终极解决之道吗?
- Net操作Excel(终极方法NPOI)
- jzoj_1月27日D组
- 解决“ .dll(或.ocx)控件已加载,但对DllregisterServer的调用失败,错误代码为0x80004005”问题的两种终极方法:SubInACL安装 VS 命令提示符
- 我们曾经以为,不受节制地玩电子游戏就是终极快乐
- jzoj3621 【BOI2011】Time is money (最小乘积系列:生成树)