题目描述

N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另一柱.仓库无限大. 现在希望用最小次数的动作完成任务.

输入

第一行给出N,K. (1 ≤ k ≤ n ≤ 100000), 下面N行,每行代表这柱砖的高度.0 ≤ hi ≤ 1000000

输出

最小的动作次数

样例输入

5 3
3
9
2
3
1

样例输出

2
考虑对于只有$k$个数的序列的最优解,显然是将所有数都变成中位数(因为如果变成的数比中位数小或者大都会有多于一半的数要改变)。
那么我们只需要维护出有$k$个连续数的序列,求出中位数并维护比中位数大的数的和及比中位数小的数的和即可得到这$k$个数的最优解,用平衡树维护即可。
对于$n$个数的序列只需要每次对连续$k$个数维护信息并求最优解然后取最小值即可。每次将第$i$个数删除,再将第$i+k$个数插入。

#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<cstdio>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
ll ans;
int n,k;
int s[100010];
struct treap
{treap *ls,*rs;int size;int val;int rnd;ll sum;treap(){}treap(treap *son,int v){ls=rs=son;size=1;val=v;sum=1ll*v;rnd=rand();}void pushup(){sum=ls->sum+rs->sum+val;size=ls->size+rs->size+1;}
}tr[100010],nil;
typedef treap* node;
node root,null,cnt;
node a,b,c;
inline void init()
{nil=treap(NULL,0);null=&nil;null->ls=null->rs=null;null->size=0;root=null;cnt=tr;
}
inline node build(int v)
{*cnt=treap(null,v);return cnt++;
}
inline node merge(node x,node y)
{if(x==null){return y;}if(y==null){return x;}if(x->rnd<y->rnd){x->rs=merge(x->rs,y);x->pushup();return x;}else{y->ls=merge(x,y->ls);y->pushup();return y;}
}
inline void split1(node rt,node &x,node &y,int k)
{if(rt==null){x=y=null;return ;}if(rt->ls->size>=k){y=rt;split1(rt->ls,x,y->ls,k);}else{x=rt;split1(rt->rs,x->rs,y,k-1-rt->ls->size);}rt->pushup();
}
inline void split2(node rt,node &x,node &y,int k)
{if(rt==null){x=y=null;return ;}if(rt->val>=k){y=rt;split2(rt->ls,x,y->ls,k);}else{x=rt;split2(rt->rs,x->rs,y,k);}rt->pushup();
}
inline void query()
{split1(root,a,b,k/2);split1(b,b,c,1);ll res=1ll*a->size*b->val-a->sum;res+=c->sum-1ll*c->size*b->val;ans=min(res,ans);root=merge(merge(a,b),c);
}
int main()
{srand(12378);scanf("%d%d",&n,&k);ans=1ll<<60;init();for(int i=1;i<=n;i++){scanf("%d",&s[i]);}for(int i=1;i<=k;i++){split2(root,a,b,s[i]);root=merge(merge(a,build(s[i])),b);}query();for(int i=k+1;i<=n;i++){split2(root,a,b,s[i-k]);split1(b,b,c,1);root=merge(a,c);split2(root,a,b,s[i]);root=merge(merge(a,build(s[i])),b);query();}printf("%lld",ans);
}

转载于:https://www.cnblogs.com/Khada-Jhin/p/10731075.html

BZOJ1112[POI2008]砖块Klo——非旋转treap相关推荐

  1. bzoj1112[POI2008]砖块Klo*

    bzoj1112[POI2008]砖块Klo 题意: N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:丢掉某柱砖的一块砖.给某柱加上一块砖,现在希望用最小次数的动作完成任务.N≤1 ...

  2. BZOJ1112 - [POI2008]砖块Klo

    原题链接 题意简述 给出一个n(n≤105)n(n \leq 10^5)个数的序列a(max{a}≤106)a(max\{a\}\leq10^6),每次给一个数+1/-1.求使得序列中存在连续k(k≤ ...

  3. 【主席树】bzoj1112: [POI2008]砖块Klo

    数据结构划一下水 Description N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另一柱.仓库无限大. ...

  4. BZOJ1112: [POI2008]砖块Klo(洛谷P3466)

    平衡树 BZOJ题目传送门 洛谷题目传送门 动态维护中位数,平衡树上一发就好了. 代码: #include<cctype> #include<cstdio> #include& ...

  5. BZOJ1112: [POI2008]砖块Klo

    Description N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另一柱.仓库无限大. 现在希望用最小次 ...

  6. bzoj1112: [POI2008]砖块Klo(splay)

    题面在这里 做法 枚举每长度为 k k k 的段寻找中位数即可.splay维护. 代码 => 主要是想说这一点,由于计算的必要,相同的数不能合并到一个节点,否则之后调用 sum[ch[x][0] ...

  7. 4923: [Lydsy1706月赛]K小值查询 平衡树 非旋转Treap

    国际惯例的题面: 这种维护排序序列,严格大于的进行操作的题都很套路...... 我们按照[0,k],(k,2k],(2k,inf)分类讨论一下就好. 显然第一个区间的不会变化,第二个区间的会被平移进第 ...

  8. [Codeforces702F]T-Shirts——非旋转treap+贪心

    题目链接: Codeforces702F 题目大意:有$n$种T恤,每种有一个价格$c_{i}$和品质$q_{i}$且每种数量无限.现在有$m$个人,第$i$个人有$v_{i}$元,每人每次会买他能买 ...

  9. BZOJ3223文艺平衡树——非旋转treap

    此为平衡树系列第二道:文艺平衡树您需要写一种数据结构,来维护一个有序数列,其中需要提供以下操作: 翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 ...

最新文章

  1. IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  2. Windows Azure 如何学习Azure
  3. idea 生成sdk,如何安装独立的Android SDK,然后将其添加到Windows上的IntelliJ IDEA?
  4. css 语音,用css完成语音助手小动画
  5. android安卓机版市场,安卓各版本市场份额数据更新 安卓8.0暴增
  6. java学习(156):反序列化
  7. python数据结构的列表_Python自带数据结构 列表(list)
  8. 利用,ArrayList,HashMap,洗牌,发牌,看牌。
  9. Mozilla 的 Flash 杀手 'Shumway' 已经现身
  10. 20200327:最大矩形(leetcode85)
  11. Hack, Everything!
  12. Ruby on Rails,创建模型,附赠模型与表名不一致时的解决方法
  13. 【002:带参宏调试】
  14. 相机姿态估计(三)--P3P
  15. Java运行环境的配置(JDK和JRE)
  16. 地表温度数据、LST温度数据、地表反照率、NDVI数据、NPP数据、植被覆盖度、土地利用数据
  17. Atitit MATLAB 图像处理 经典书籍attilax总结
  18. aauto的listview(类似于C#的datagrid) 支持文件拖拽获取名单
  19. Jmeter接口压力测试
  20. 如何快速给多张图片添加边框,这招你一定要会

热门文章

  1. CentOS基础命令大全
  2. 12本最优秀的Android开发电子书强力推荐
  3. Rabbitmq后台运行命令
  4. SAP Workload Monitor
  5. CommunityServer数据部分名词解释
  6. 数据结构之二叉搜索树/二叉查找数/有序二叉树/排序二叉树
  7. 互联网大佬口口声声的人工智能,笑到最后的也许是马云的云计算
  8. C#.NET如何判断是否有缺少的using
  9. 我的Linux成长路---001 Linux学习初期计划
  10. [c#基础]关于try...catch最常见的笔试题