1112: [POI2008]砖块Klo


Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 2353  Solved: 831
[Submit][Status][Discuss]

Description


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

Input


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

Output


最小的动作次数

Sample Input



Sample Output



HINT


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

分析:


splay求中位数。

 

AC代码:


# include <iostream>
# include <cstdio>
# include <cstring>
using namespace std;
typedef long long LL;
const int N = 1e5 + ;
LL s[N],ret = 1e18;int n,K,root,cnt;
struct node{
int ch[];
int fa;
int sz;LL val,sum;
node(){}
node(LL val):fa(),sz(),val(val),sum(sum){ch[] = ch[] = ;}
}a[N];
void push(int x)
{
a[x].sz = a[a[x].ch[]].sz + a[a[x].ch[]].sz + ;
a[x].sum = a[a[x].ch[]].sum + a[a[x].ch[]].sum + a[x].val;
}
void rotate(int now,int d)
{
int pre = a[now].fa,g = a[pre].fa,nex = a[now].ch[d];
a[pre].ch[d ^ ] = nex;
if(nex)a[nex].fa = pre;
a[now].fa = g;
if(g)a[g].ch[a[g].ch[] == pre] = now;
a[pre].fa = now;a[now].ch[d] = pre;
push(pre);push(now);
}
void splay(int now)
{
int pre,g;
while(a[now].fa)
{
pre = a[now].fa,g = a[pre].fa;
if(g && !((a[pre].ch[] == now) ^ (a[g].ch[] == pre)))rotate(pre,a[pre].ch[] == now);
rotate(now,a[pre].ch[] == now);
}
root = now;
}
void insert(LL val)
{
if(!root){a[++cnt] = node(val);root = cnt;return;}
int now = root,pre;
while(now)
{
pre = now;
now = a[now].ch[val > a[now].val];
}
a[++cnt] = node(val);a[cnt].fa = pre;
a[pre].ch[val > a[pre].val] = cnt;
splay(cnt);
}
void erase(int now)
{
splay(now);
if(!a[now].ch[] || !a[now].ch[]){root = a[now].ch[] + a[now].ch[];}
else
{
int p = a[now].ch[];
while(a[p].ch[])p = a[p].ch[];
a[p].ch[] = a[now].ch[];
a[a[now].ch[]].fa = p;
root = a[now].ch[];a[root].fa = ;
splay(a[now].ch[]);
}
a[root].fa = ;
}
int find(int k)
{
int now = root;
while(k > )
{
if(a[a[now].ch[]].sz < k){k -= a[a[now].ch[]].sz;k--;if(k > )now = a[now].ch[];}
else now = a[now].ch[];
}
return now;
}
int main()
{
scanf("%d %d",&n,&K);
for(int i = ;i <= n;i++)scanf("%lld",&s[i]);
for(int i = ;i < K;i++)insert(s[i]);
for(int i = K;i <= n;i++)
{
if(i - K)erase(i - K);
insert(s[i]);
int now = find((K + ) >> );
splay(now);
LL s1 = a[a[now].ch[]].sz,s2 = a[a[now].ch[]].sz;
LL pre = a[a[now].ch[]].sum,bef = a[a[now].ch[]].sum;
if(s1 * a[now].val - pre + bef - s2 * a[now].val < ret)ret = s1 * a[now].val - pre + bef - s2 * a[now].val;
}
printf("%lld\n",ret);
}

[Bzoj1112][POI2008]砖块Klo(splay)的更多相关文章

  1. [BZOJ1112][POI2008]砖块Klo

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

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

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

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

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

  4. BZOJ1112[POI2008]砖块Klo——非旋转treap

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

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

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

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

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

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

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

  8. 1112: [POI2008]砖块Klo

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

  9. BZOJ 1112: [POI2008]砖块Klo

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

随机推荐

  1. 初识 Hibernate

    Hibernate 框架 1.1   什么是框架? 框架是一个提供了可重用的公共结构半成品. 2.1   关于Hibernate Hibernate是数据持久层的一个轻量级框架.数据持久层的框架有很多 ...

  2. shell脚本,awk数组之如何处理多个文件。

    [root@localhost | > file [root@localhost - | > file1 [root@localhost awk]# cat file [root@loca ...

  3. FTP文传协议的应用

    我开发的项目中一直用到都是AFNetworking上传图片的方法,最近老大说要用FTP上传,网上的资料很少,毕竟这种上传方式现在用的不多了,于是花了一天时间学习了FTP文件传输协议.下面是我的个人理解 ...

  4. ios多线程之NSOperation

    使用 NSOperation的方式有两种, 一种是用定义好的两个子类: NSInvocationOperation 和 NSBlockOperation. 另一种是继承NSOperation 如果你也 ...

  5. grep-sed命令用法:

    用户切换 su username:非登录式切换 su - username:登录式切换 su -l username:登录式切换 su username -c COMMAND   echo -n   ...

  6. VUE +element el-table运用sortable 拖拽table排序,实现行排序,列排序

    Sortable.js是一款轻量级的拖放排序列表的js插件(虽然体积小,但是功能很强大) 项目需求是要求能对element中 的table进行拖拽行排序 这里用到了sorttable Sortable ...

  7. python--MySQl单表查询

    一.  关键字的执行优先级(重点) from where group by having # 使用是要放在group by 后面而且前面必须有group by select distinct # 去重 ...

  8. UITextView 实现placeholder

    1.在创建textView的时候,赋值其文本属性 即 textView.text = @"内容": 2.在开始编辑的代理方法中进行如下操作 - (void)textViewDidB ...

  9. 牛客网暑期ACM多校训练营(第五场) E room(最小费用最大流 , 最小权二分图匹配模板)

    链接: https://www.nowcoder.com/acm/contest/143/E 题意: 给定n个宿舍的新安排, 每个宿舍都有4个人, 问要至少有多少个人换位才能变成新安排. 可以建一个二 ...

  10. 包含min的栈

    #include <iostream> #include <stack> using namespace std; void push(stack<int> &am ...