BZOJ1112[POI2008]砖块Klo——非旋转treap
题目描述
N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另一柱.仓库无限大. 现在希望用最小次数的动作完成任务.
输入
第一行给出N,K. (1 ≤ k ≤ n ≤ 100000), 下面N行,每行代表这柱砖的高度.0 ≤ hi ≤ 1000000
输出
最小的动作次数
样例输入
3
9
2
3
1
样例输出
#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的更多相关文章
- [bzoj1112][POI2008]砖块Klo_非旋转Treap
砖块Klo bzoj-1112 POI-2008 题目大意:$N$柱砖,希望有连续$K$柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖 ...
- [BZOJ1112][POI2008]砖块Klo
[BZOJ1112][POI2008]砖块Klo 试题描述 N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另 ...
- [Bzoj1112][POI2008]砖块Klo(splay)
1112: [POI2008]砖块Klo Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2353 Solved: 831[Submit][Statu ...
- [BZOJ1112] [POI2008] 砖块Klo (treap)
Description N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另一柱.仓库无限大. 现在希望用最小次 ...
- 【主席树】bzoj1112: [POI2008]砖块Klo
数据结构划一下水 Description N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另一柱.仓库无限大. ...
- 【枚举】【权值分块】bzoj1112 [POI2008]砖块Klo
枚举长度为m的所有段,尝试用中位数更新答案. 所以需要数据结构,支持查询k大,以及大于/小于 k大值 的数的和. 平衡树.权值线段树.权值分块什么的随便呢. #include<cstdio> ...
- 【BZOJ1112】[POI2008]砖块Klo Treap
[BZOJ1112][POI2008]砖块Klo Description N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出 ...
- BZOJ 1112: [POI2008]砖块Klo
1112: [POI2008]砖块Klo Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1736 Solved: 606[Submit][Statu ...
- 1112: [POI2008]砖块Klo
1112: [POI2008]砖块Klo Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1245 Solved: 426[Submit][Statu ...
随机推荐
- 极光推送经验之谈-Java后台服务器实现极光推送的两种实现方式
原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/6439313.html Java后台实现极光推送有两种方式,一种是使用极光推送官方提供的推送请 ...
- Linux 命令行
Linux 命令笔记 一.目录/文件 1.1 目录文件日常操作 . -> 当前目录 .. -> 上一级目录 .file/.dir -> 隐藏文件/文件夹 [ls] 查看指定目录文件 ...
- C#的一些获取时间的例子
从周一到周日的顺序,获取排序数值: int i = DateTime.Now.DayOfWeek - DayOfWeek.Monday; if (i == -1) i = 6; 获取某日起,星期一日期 ...
- C++系列总结——继承
前言 前面讲了封装,但封装只是隐藏了类内部实现.如果使用多态隐藏类本身的话,只有封装是不够的,还需要继承. 继承 通过封装.我们把一些相关的函数和变量包裹在了一起,这些函数和变量就叫做类的成员函数和成 ...
- html 微信video放大后无法返回问题
android video播放视频放大后无法返回,先debug下debugx5.qq.com 发现用的不是X5内核 直接激活 debugmm.qq.com/?forcex5=true 问题解决 ...
- Math.floor(Math.random()*3+1)
Math.random():获取0~1随机数 Math.floor() method rounds a number DOWNWARDS to the nearest integer, and ret ...
- ubuntu server 16.04 开启root密码登录
0x00 ubuntu server 16.04 开启root密码登录 由于众多VPS默认使用证书验证登录,虽然安全但使用十分不便,所以特提供开启root用户并使用密码登录方法. 0x01 为root ...
- Android为TV端助力 电影栏目移动到底部或者顶部时抖动动画
1 移动到底部上下抖动ObjectAnimator animatorX = ObjectAnimator.ofFloat(holder.itemView,"translationX" ...
- Android 简单统计文本文件字符数、单词数、行数Demo
做的demo是统计文本文件的字符数.单词数.行数的,首先呢,我们必须要有一个文本文件.所以我们要么创建一个文本文件,并保存,然后再解析:要么就提前把文本文件先放到模拟器上,然后检索到文本名再进行解析. ...
- <3>Centos系统完整安装python流程
一.环境 系统:Centos7 Python:3.6.5 自带pip.setuptools 二.命令 介绍:因为yum是依赖于python2,所以千万别删除自带的python2,下面的方法就是py2 ...