1112: [POI2008]砖块Klo Splay+中位数
来源:互联网 发布:js点击按钮数字加一 编辑:程序博客网 时间:2024/04/20 06:34
似乎和前几天做那道IOI的题有点相似?都是维护中位数。
不过IOI的题良心多了QAQ,坐标是递增的所以直接线性维护就好了。。然而。。这个显然需要维护一个区间K大,且支持插入删除操作。
好久没打splay手生。。删除后忘记上传标记T了好久。。
果然常数巨大,被各路treap和set(卧槽)虐成狗了。
#include<bits/stdc++.h>#define inf 1e18#define ll long long #define N 100005using namespace std;int n,k,t1,t2,cnt,root;ll ans=inf;int size[N],h[N],fa[N],num[N],tree[N][2];ll sum[N];inline int read(){ int a=0,f=1; char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();} while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();} return a*f;}inline void pushup(int k){ size[k]=size[tree[k][0]]+size[tree[k][1]]+1; sum[k]=sum[tree[k][0]]+sum[tree[k][1]]+(ll)num[k];}inline void rotate(int x,int &k){ int y=fa[x],z=fa[y],l=tree[y][1]==x,r=l^1; if (y==k) k=x; else tree[z][tree[z][1]==y]=x; fa[x]=z; fa[y]=x; fa[tree[x][r]]=y; tree[y][l]=tree[x][r]; tree[x][r]=y; pushup(y); pushup(x);}inline void splay(int x,int &k){ while (x!=k) { int y=fa[x],z=fa[y]; if (y!=k) { if (tree[y][0]==x^tree[z][0]==y) rotate(x,k); else rotate(y,k); } rotate(x,k); }}void insert(int &k,int x,int f){ if (!k) { k=++cnt; fa[k]=f; num[k]=x; size[k]=1; splay(k,root); return; } if (x<num[k]) insert(tree[k][0],x,k); else insert(tree[k][1],x,k);}int ask_kth(int k,int rank){ if (!k) return -1; if (size[tree[k][0]]+1==rank) return k; else if (size[tree[k][0]]+1>rank) return ask_kth(tree[k][0],rank); else return ask_kth(tree[k][1],rank-size[tree[k][0]]-1);}int main(){ n=read(); k=read(); for (int i=1;i<=n;i++) h[i]=read(); for (int i=1;i<k;i++) insert(root,h[i],0); for (int i=1;i<=n-k+1;i++) { int t; insert(root,h[i+k-1],0); t=ask_kth(root,(k+1)>>1); splay(t,root); ll tot=(ll)num[t]*size[tree[t][0]]-sum[tree[t][0]]; tot+=sum[tree[t][1]]-(ll)num[t]*size[tree[t][1]]; ans=min(ans,tot); splay(i,root); if (tree[i][0]) { root=tree[i][0]; int x=tree[i][0]; while (tree[x][1]) x=tree[x][1]; fa[tree[i][1]]=x; tree[x][1]=tree[i][1]; fa[tree[i][0]]=0; tree[i][0]=tree[i][1]=0; while (x) pushup(x),x=fa[x]; } else fa[tree[i][1]]=0,root=tree[i][1],tree[i][1]=0; } cout << ans;}
0 0
- 1112: [POI2008]砖块Klo Splay+中位数
- bzoj 1112: [POI2008]砖块Klo(splay)
- Bzoj1112:[POI2008]砖块Klo:splay
- 【BZOJ1112】[POI2008]砖块Klo【Splay】
- 1112: [POI2008]砖块Klo
- 1112: [POI2008]砖块Klo
- BZOJ 1112: [POI2008]砖块Klo 线段树维护区间中位数
- [BZOJ1112][POI2008]砖块Klo(splay)
- 【BZOJ 1112】 [POI2008]砖块Klo
- bzoj 1112 [POI2008]砖块Klo
- BZOJ 1112 POI2008 砖块Klo Treap
- BZOJ 1112 [POI2008]砖块Klo Treap
- bzoj 1112: [POI2008]砖块Klo treap
- 【BZOJ 1112】Poi2008砖块Klo treap
- 【BZOJ】1112 [POI2008]砖块Klo 平衡树
- BZOJ 1112: [POI2008]砖块Klo treap
- BZOJ 1112 [POI2008]砖块Klo Treap
- [POI2008]砖块Klo
- intellij idea和maven结合的简单实用,部署一个web项目
- 推荐提升 Android 性能的建议
- Qt 常用命令,宏,pro文件格式
- php设计模式详解
- 书中自有黄金屋:动荡时期值得深读的10本金融书籍
- 1112: [POI2008]砖块Klo Splay+中位数
- SSH中使用jpa注解方式配置实体类
- Matlab转C++项目中遇到的问题
- 第1章Activity的生命周期和启动模式
- 表单提交中get和post方式的区别
- 推荐提升 Android 性能的建议
- 召唤小伙伴-小妖
- 早安语录
- windows下python自动补齐