题目描述

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);
}

BZOJ1112[POI2008]砖块Klo——非旋转treap的更多相关文章

  1. [bzoj1112][POI2008]砖块Klo_非旋转Treap

    砖块Klo bzoj-1112 POI-2008 题目大意:$N$柱砖,希望有连续$K$柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖 ...

  2. [BZOJ1112][POI2008]砖块Klo

    [BZOJ1112][POI2008]砖块Klo 试题描述 N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另 ...

  3. [Bzoj1112][POI2008]砖块Klo(splay)

    1112: [POI2008]砖块Klo Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2353  Solved: 831[Submit][Statu ...

  4. [BZOJ1112] [POI2008] 砖块Klo (treap)

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

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

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

  6. 【枚举】【权值分块】bzoj1112 [POI2008]砖块Klo

    枚举长度为m的所有段,尝试用中位数更新答案. 所以需要数据结构,支持查询k大,以及大于/小于 k大值 的数的和. 平衡树.权值线段树.权值分块什么的随便呢. #include<cstdio> ...

  7. 【BZOJ1112】[POI2008]砖块Klo Treap

    [BZOJ1112][POI2008]砖块Klo Description N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出 ...

  8. BZOJ 1112: [POI2008]砖块Klo

    1112: [POI2008]砖块Klo Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1736  Solved: 606[Submit][Statu ...

  9. 1112: [POI2008]砖块Klo

    1112: [POI2008]砖块Klo Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1245  Solved: 426[Submit][Statu ...

随机推荐

  1. Ambiguous HTTP method Actions require an explicit HttpMethod binding for Swagger 2.0

    异常内容 NotSupportedException: Ambiguous HTTP method for action . Actions require an explicit HttpMetho ...

  2. 0422作业:基础(if,while)

    """ 1.题目:企业发放的奖金根据利润提成.利润(I)低于或等于10万元时,奖金可提10%: 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10 ...

  3. 包、继承以及 LeetCode 27、28题

    1 package.import 和 import static 1.1 Package Java 引入了包(Package)机制,提供了类的多层命名空间,用于解决类的命名冲突.类文件管理问题.Jav ...

  4. PHP 安装扩展 phpize

    报错 执行 phpize 时, 报如下错误: grep: /usr/include/php/main/php.h: No such file or directory grep: /usr/inclu ...

  5. JavaScript中的typeof

    js中的 typeof 操作符返回一个字符串,表示未经计算的操作数的类型. 其中null.字符串对象.数字对象.布尔对象.日期.数组.正则返回结果都为object,可见typeof返回结果并不精确 测 ...

  6. arcgis api 4.x for js之图层管理篇

    上篇实现了基础地图加载以及二三维模式切换:本篇的内容则是图层管理控制,从两个不同角度来实现,分别是直接绑定arcgis api提供的图层管理widget(LayerList)以及自定义图层管理图标的点 ...

  7. Android Studio教程01-的工程和目录结构解析

    目录 1.主目录 1.1. app目录 1.2.项目资源文件夹res 2. 理解build.gradle文件 2.1. 外部build.gradle 2.2. app文件下的build.gradle ...

  8. POST一下就知道:人生苦短,我用Python!

    Python编程笔记---- 背景: “闸机端”简版程序要求: 读取扫描仪得到的userID; 向服务器发送请求进行验证: 根据返回值(True/False)决定闸机的信号. 1. 文件的读取 网上买 ...

  9. Spark RPC框架源码分析(二)RPC运行时序

    前情提要: Spark RPC框架源码分析(一)简述 一. Spark RPC概述 上一篇我们已经说明了Spark RPC框架的一个简单例子,Spark RPC相关的两个编程模型,Actor模型和Re ...

  10. Linux学习历程——Centos 7 账户管理命令(用户篇)useradd usermod userdel

    一.命令介绍 useradd     用于创建新的用户 usermod    用于修改用户属性 userdel      用于删除用户 -------------------------------- ...