1112: [POI2008]砖块Klo

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 1736  Solved: 606
[Submit][Status][Discuss]

Description

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

Input

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

Output

最小的动作次数

Sample Input

5 3
3
9
2
3
1

Sample Output

2

HINT

原题还要求输出结束状态时,每柱砖的高度.本题略去.

Source

 

[Submit][Status][Discuss]

分析

对于一段区间,可以知道将高度改为中位数是最优的,因此我们需要做的是维护一个区间的中位数,以及小于中位数的数字之和和大于中位数的数字之和,这个可以平衡树,可以树状数组+二分查找,或者是线段树上二分,甚至是STL set,做法太多……

代码

 #include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm> #define ri register int #define lim 10000000 char *c = new char[lim]; template <class T>
void read(T &x)
{
x = ; while (*c < '')++c; while (*c >= '')
x = x* + *c++ - '';
} template <class T>
void Min(T &a, T b)
{
if (a > b)a = b;
} template <class T>
void Max(T &a, T b)
{
if (a < b)a = b;
} #define N 1000005 int n, m;
int h[N]; struct node
{
int lt, rt, cnt;
long long sum;
}tree[N * ]; void build(int p, int l, int r)
{
node &t = tree[p]; t.lt = l;
t.rt = r; t.cnt = t.sum = ; if (l ^ r)
{
int mid = (l + r) >> ; build(p << , l, mid);
build(p << | , mid + , r);
}
} void insert(int p, int pos, int val1, int val2)
{
node &t = tree[p]; t.cnt += val1;
t.sum += val2; if (t.lt ^ t.rt)
{
int mid = (t.lt + t.rt) >> ; if (pos <= mid)
insert(p << , pos, val1, val2);
else
insert(p << | , pos, val1, val2);
}
} int query1(int p, int rank)
{
node &t = tree[p]; if (t.lt == t.rt)return t.lt; if (tree[p << ].cnt >= rank)
return query1(p << , rank);
else
return query1(p << | , rank - tree[p << ].cnt);
} long long query2(int p, int l, int r)
{
if (l > r)return 0LL; node &t = tree[p]; if (l == t.lt && r == t.rt)
return t.sum; int mid = (t.lt + t.rt) >> ; if (r <= mid)
return query2(p << , l, r);
if (l > mid)
return query2(p << | , l, r);
return query2(p << , l, mid) + query2(p << | , mid + , r);
} int query3(int p, int l, int r)
{
if (l > r)return 0LL; node &t = tree[p]; if (l == t.lt && r == t.rt)
return t.cnt; int mid = (t.lt + t.rt) >> ; if (r <= mid)
return query3(p << , l, r);
if (l > mid)
return query3(p << | , l, r);
return query3(p << , l, mid) + query3(p << | , mid + , r);
} signed main(void)
{
fread(c, , lim, stdin); read(n);
read(m); ri maxi = ;
ri mini = N; for (ri i = ; i <= n; ++i)
{
read(h[i]); Min(mini, h[i]);
Max(maxi, h[i]);
} build(, , N); for (ri i = ; i < m; ++i)
insert(, h[i], , h[i]); int d = (m + ) >> ; long long ans = 1e18 + ; for (ri i = m; i <= n; ++i)
{
insert(, h[i], , h[i]); {
int mid = d; long long q = query1(, mid), res = 0LL; long long lc = query3(, , q - );
long long rc = query3(, q + , N); res += lc*q - query2(, , q - );
res += query2(, q + , N) - rc*q; Min(ans, res);
} insert(, h[i - m + ], -, -h[i - m + ]);
} printf("%lld\n", ans);
}

BZOJ_1112.cpp

@Author: YouSiki

BZOJ 1112: [POI2008]砖块Klo的更多相关文章

  1. [BZOJ 1112] [POI2008] 砖块Klo 【区间K大】

    题目链接:BZOJ - 1112 题目分析 枚举每一个长度为k的连续区间,求出这个区间的最优答案,更新全局答案. 可以发现,这个区间的所有柱子最终都变成这k个数的中位数时最优,那么我们就需要查询这个区 ...

  2. 线段树 || BZOJ 1112: [POI2008]砖块Klo

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1112 题解: 希望有连续K柱的高度是一样的,就先把1~K的数扔进线段树(线段树的下标就是数值 ...

  3. BZOJ 1112 [POI2008]砖块Klo(可持久化线段树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1112 [题目大意] 给出一个数列,对于一个操作,你可以对一个数+1,或者一个数-1, ...

  4. bzoj 1112: [POI2008]砖块Klo【对顶堆】

    priority_queue实现的对顶堆,细节超级多WA了十几次--但是理论上是最简便的orz其实是我已经不会写平衡树了 枚举左端点,显然要把这一段的高度搞成(l,l+k-1)的高度中位数,所以需要一 ...

  5. BZOJ 1112: [POI2008]砖块Klo Splay + 性质分析

    Code: #include<bits/stdc++.h> using namespace std; #define setIO(s) freopen(s".in",& ...

  6. BZOJ 1112: [POI2008]砖块Klo1112( BST )

    枚举每个长度为k的区间, 然后用平衡树找中位数进行判断, 时间复杂度O(nlogn). 早上起来精神状态不太好...连平衡树都不太会写了...果断去看了会儿番然后就A了哈哈哈 ------------ ...

  7. 1112: [POI2008]砖块Klo

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

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

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

  9. [BZOJ1112][POI2008]砖块Klo

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

随机推荐

  1. WARN util.NativeCodeLoader: Unable to load native-hadooplibrary for your platform… using builtin-java classes where applicable

    方法1glibc 官方要求的2.14版本以上 方法2:http://www.secdoctor.com/html/yyjs/31101.html 方法3: http://dl.bintray.com/ ...

  2. http协议(九)响应首部字段

    响应首部字段: 服务器向客户端返回响应报文中所使用的字段,用于补充的附加信息.服务器信息.以及对客户端的附加要求等 1.Accept-Ranges 告知客户端服务器能否处理范围请求,以指定获取服务器的 ...

  3. python的高级特性3:神奇的__call__与返回函数

    __call__是一个很神奇的特性,只要某个类型中有__call__方法,,我们可以把这个类型的对象当作函数来使用. 也许说的比较抽象,举个例子就会明白. In [107]: f = abs In [ ...

  4. PAT 1031. 查验身份证(15)

    一个合法的身份证号码由17位地区.日期编号和顺序编号加1位校验码组成.校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8, ...

  5. windows和ubuntu下gif动态图片的制作

    现在社交软件中, 各种各样的动图为大家交流很大的乐趣.  Gif图片比视频小, 比静态JPG图片形象生动, 更适用于产品展示和步骤演示等. 这里简单介绍一下在window系统和ubuntu系统下gif ...

  6. Github 简明教程

    http://www.runoob.com/w3cnote/git-guide.html http://rogerdudler.github.io/git-guide/index.zh.html

  7. React入门 (1)—使用指南(包括ES5和ES6对比)

    前言 本篇会简明扼要的介绍一下React的使用方法.代码会用JSX+ES5和JSX+ES6两种方式实现. React简介 React来自Facebook,于2013年开源.至今不断修改完善,现在已经到 ...

  8. vbs keys

    其使用格式为: object.SendKeys string "object":表示WshShell对象 "string":表示要发送的按键指令字符串,需要放在 ...

  9. 《程序设计教学法--以Java程序设计为例》

    <程序设计教学法--以Java程序设计为例> 当老师上的第一门课就是<Java程序设计>,工作以来,断断续续上了近十次课了吧.十几年来,教材.课程内容.教学方法.教学手段不断改 ...

  10. centos7下使用yum安装mysql数据库以及设置远程访问

    CentOS7的yum源中默认好像是没有mysql的.为了解决这个问题,我们要先下载mysql的repo源. 1. 下载mysql的repo源 $ wget http://repo.mysql.com ...