BZOJ 1112: [POI2008]砖块Klo 线段树维护区间中位数
来源:互联网 发布:大同市风力发电数据 编辑:程序博客网 时间:2024/05/01 13:00
时空隧道
翻译一下就是求出任意长度为k的区间的中位数
代码如下:
#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>//by NeighThorn#define inf 100000000000using namespace std;const int maxn=100000+5,maxh=1000000+5;int n,k,h[maxn],m,midnum;long long ans;struct Tree{ int l,r,cnt; long long sum;}tree[maxh*4];struct M{ int cnt; long long sum; M(long long x=0,int y=0){ sum=x,cnt=y; }}aql,anqila;inline int read(void){ char ch=getchar();int x=0; while(!(ch>='0'&&ch<='9')) ch=getchar(); while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(); return x;}inline void build(int l,int r,int tr){ tree[tr].l=l,tree[tr].r=r,tree[tr].sum=tree[tr].cnt=0; if(l==r) return; int mid=(l+r)>>1; build(l,mid,tr<<1);build(mid+1,r,tr<<1|1);}inline void change(int pos,int val,int tr){ if(tree[tr].l==tree[tr].r){ tree[tr].cnt+=val;tree[tr].sum+=val*pos; return; } int mid=(tree[tr].l+tree[tr].r)>>1; if(pos<=mid) change(pos,val,tr<<1); else change(pos,val,tr<<1|1); tree[tr].cnt=tree[tr<<1].cnt+tree[tr<<1|1].cnt; tree[tr].sum=tree[tr<<1].sum+tree[tr<<1|1].sum;}inline int querynum(int num,int tr){ if(tree[tr].l==tree[tr].r) return tree[tr].l; if(tree[tr<<1].cnt<num) return querynum(num-tree[tr<<1].cnt,tr<<1|1); else return querynum(num,tr<<1);}inline M querysum(int l,int r,int tr){ if(l<-1) return M(0,0); if(l>r) return M(0,0); if(tree[tr].l==l&&tree[tr].r==r) return M(tree[tr].sum,tree[tr].cnt); int mid=(tree[tr].l+tree[tr].r)>>1; if(r<=mid) return querysum(l,r,tr<<1); else if(l>mid) return querysum(l,r,tr<<1|1); else{ M tmp=querysum(l,mid,tr<<1),temp=querysum(mid+1,r,tr<<1|1); tmp.cnt+=temp.cnt,tmp.sum+=temp.sum; return tmp; }}signed main(void){ n=read();k=read();m=0; for(int i=1;i<=n;i++) h[i]=read(),m=max(m,h[i]); if(k==1){ puts("0");return 0; } build(0,m,1);midnum=(1+k)>>1; for(int i=1;i<=k;i++) change(h[i],1,1); int lala=querynum(midnum,1);aql=querysum(0,lala-1,1),anqila=querysum(lala+1,m,1);ans=aql.cnt*lala-aql.sum+anqila.sum-lala*anqila.cnt;// cout<<"lala"<<lala<<" "<<ans<<endl; for(int i=k+1;i<=n;i++) change(h[i-k],-1,1),change(h[i],1,1),lala=querynum(midnum,1),/*cout<<"lala"<<lala<<" ",*/aql=querysum(0,lala-1,1),anqila=querysum(lala+1,m,1)/*,cout<<aql.cnt<<" "<<aql.sum<<" "<<anqila.cnt<<" "<<anqila.sum<<endl*/,ans=min(ans,aql.cnt*lala-aql.sum+anqila.sum-lala*anqila.cnt)/*,cout<<ans<<endl*/; printf("%lld\n",ans); return 0;}
by >_< NeighThorn
1 0
- BZOJ 1112: [POI2008]砖块Klo 线段树维护区间中位数
- 【BZOJ】1112 [POI2008]砖块Klo 平衡树
- 【BZOJ 1112】 [POI2008]砖块Klo
- bzoj 1112 [POI2008]砖块Klo
- 1112: [POI2008]砖块Klo Splay+中位数
- BZOJ 1112: [POI2008]砖块Klo 平衡树,思维,枚举
- BZOJ 1112 POI2008 砖块Klo Treap
- BZOJ 1112 [POI2008]砖块Klo Treap
- bzoj 1112: [POI2008]砖块Klo(splay)
- bzoj 1112: [POI2008]砖块Klo treap
- 【BZOJ 1112】Poi2008砖块Klo treap
- BZOJ 1112: [POI2008]砖块Klo treap
- BZOJ 1112 [POI2008]砖块Klo Treap
- 1112: [POI2008]砖块Klo
- 1112: [POI2008]砖块Klo
- 【BZOJ】【P1112】【POI2008】【砖块Klo】【题解】【map】
- bzoj-1112 砖块Klo
- [主席树] BZOJ1112: [POI2008]砖块Klo
- 二次开发 maven项目配置相关
- linux 设备驱动之平台总线
- java是一门思路为主的语言!
- 第十周回文数
- iOS 价格会有那种 中间的横线
- BZOJ 1112: [POI2008]砖块Klo 线段树维护区间中位数
- navicat快捷键
- String Master
- hibernate错误
- 网站测速并给出解决方案
- iOS UILabel 加载 HTML文字
- Spring Quartz 动态配置定时任务
- 登录 注册 正则验证
- javascript form onsubmit中的return 后面跟一个函数,其中return 起什么作用