bzoj1112 POI2008 砖块Klo 树状数组
来源:互联网 发布:淘宝达人怎么从新申请 编辑:程序博客网 时间:2024/05/17 07:15
fuxey必须%。。。
树状数组的话,其实就是相当于滑动窗口,然后用树状数组维护当前中位数,总和用前缀和搞一下,就可以直接算了。
#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;const int inf=0x7fffffff;const int N=1e5+5;int n,k;int a[N];typedef long long ll;ll d1[N*10],d2[N*10],ans;int mx;inline int lowbit(int x){ return x&(-x);}inline void add(int x,int y,ll *d){ while (x<=mx) { d[x]+=y; x+=lowbit(x); }}inline ll query(int x,ll *d){ ll ans=0; while (x>0) { ans+=d[x]; x-=lowbit(x); } return ans;}inline int find(int k,ll *d){ int ans=0,cnt=0; fd(i,20,0) { ans+=1<<i; if (ans>mx||cnt+d[ans]>=k)ans-=1<<i; else cnt+=d[ans]; } return ans+1;}int main(){ scanf("%d%d",&n,&k); fo(i,1,n) { scanf("%d",&a[i]); mx=max(mx,a[i]); } fo(i,1,n+1)a[i]++; int cnt=k; ans=1e15; ll sum=0; fo(i,1,k) add(a[i],1,d1), add(a[i],a[i],d2),sum+=a[i]; while(cnt<=n) { int now=find((k+1)/2,d1); ll m1=query(now,d1); ll m2=query(now,d2); ans=min(ans,sum-2*m2+m1*now-(k-m1)*now); sum-=a[cnt-k+1]; add(a[cnt-k+1],-1,d1); add(a[cnt-k+1],-a[cnt-k+1],d2); sum+=a[cnt+1]; add(a[cnt+1],1,d1); add(a[cnt+1],a[cnt+1],d2); cnt++; } printf("%lld\n",ans);}
0 0
- bzoj1112 POI2008 砖块Klo 树状数组
- bzoj1112 [POI2008]砖块Klo(平衡树/map/树状数组)
- bzoj1112 [POI2008]砖块Klo
- bzoj1112【poi2008】砖块klo
- 【POI2008】【BZOJ1112】砖块Klo
- BZOJ1112: [POI2008]砖块Klo
- bzoj1112: [POI2008]砖块Klo
- 【bzoj1112】[POI2008]砖块Klo
- [bzoj1112][POI2008]砖块Klo
- Bzoj1112:[POI2008]砖块Klo:splay
- 【BZOJ1112】[POI2008]砖块Klo【Splay】
- BZOJ1112: [POI2008]砖块Klo Treap
- [BZOJ1112][POI2008]砖块Klo(splay)
- [主席树] BZOJ1112: [POI2008]砖块Klo
- [BZOJ1112]砖块klo Treap
- 【BZOJ1112】砖块Klo
- 【bzoj1112】【poi2008】【砖块】【treap】
- [POI2008]砖块Klo
- oracle存储过程
- 修改提交(编译版本的)
- JPA概要
- C# 时间帮助类
- Gson使用指南(2)
- bzoj1112 POI2008 砖块Klo 树状数组
- 关于C++中的构造函数的一点总结
- Android获取ImageView上的图片,和一个有可能遇到的问题!
- faster_rcnn_end2end.sh源码分析
- ls1021atwr 配置SD卡启动内核
- SVN 中trunk、tags、branches使用
- CSS布局方案
- 日志打印-log4j
- Git使用详细教程