[POI2008]砖块Klo
题目
爆炸\(OJ\)机子太慢了吧实在不想打平衡树了
做法
烂大街的一个概念:求中位数
然后求前缀差和后缀差,主席树模板题
注意\(int\)和\(long long\)
My complete code
#include<bits/stdc++.h>
#pragma GCC optimize (2)
#pragma G++ optimize (2)
using namespace std;
typedef long long LL;
inline LL Read(){
LL x(0),f(1); char c=getchar();
while(c<'0' || c>'9'){ if(c=='-')f=-1; c=getchar(); }
while(c>='0' && c<='9') x=(x<<3)+(x<<1)+c-'0', c=getchar();
return x*f;
}
const int inf=0x3f3f3f3f,maxn=1e7+9;
int n,k,nod;
int size[maxn],son[maxn][2],a[maxn],root[maxn],b[maxn],id[maxn];
LL sum[maxn];
void Update(int &now,int pre,int l,int r,int x,int val){
now=++nod;
size[now]=size[pre]+1;
sum[now]=sum[pre]+(LL)val;
if(l==r) return;
int mid(l+r>>1);
if(x<=mid){
Update(son[now][0],son[pre][0],l,mid,x,val);
son[now][1]=son[pre][1];
}else{
Update(son[now][1],son[pre][1],mid+1,r,x,val);
son[now][0]=son[pre][0];
}
}
int Qkth(int now,int pre,int l,int r,int k){
if(l==r) return b[l];
int ret(size[son[now][0]]-size[son[pre][0]]);
int mid(l+r>>1);
if(k>ret) return Qkth(son[now][1],son[pre][1],mid+1,r,k-ret);
else return Qkth(son[now][0],son[pre][0],l,mid,k);
}
LL Qll(int now,int pre,int l,int r,int x,int val){
if(l==r) return (LL)val-b[l];
int mid(l+r>>1);
if(x<=mid) return Qll(son[now][0],son[pre][0],l,mid,x,val);
else return (LL)(size[son[now][0]]-size[son[pre][0]])*val-(sum[son[now][0]]-sum[son[pre][0]])+Qll(son[now][1],son[pre][1],mid+1,r,x,val);
}
LL Qbg(int now,int pre,int l,int r,int x,int val){
if(l==r) return b[l]-val;
int mid(l+r>>1);
if(x<=mid) return Qbg(son[now][0],son[pre][0],l,mid,x,val)+(sum[son[now][1]]-sum[son[pre][1]])-(LL)(size[son[now][1]]-size[son[pre][1]])*val;
else return Qbg(son[now][1],son[pre][1],mid+1,r,x,val);
}
int main(){
n=Read(); k=Read();
for(int i=1;i<=n;++i)
a[i]=b[i]=Read();
sort(b+1,b+1+n);
int cnt=unique(b+1,b+1+n)-b-1;
for(int i=1;i<=n;++i){
id[i]=lower_bound(b+1,b+1+cnt,a[i])-b;
Update(root[i],root[i-1],1,cnt,id[i],a[i]);
}
int mid(k+1>>1),fir,mi;
LL ans(1e18);
for(int l=1;l+k-1<=n;++l){
int r(l+k-1);
LL ret(0);
int zw=Qkth(root[r],root[l-1],1,cnt,mid);
int x=lower_bound(b+1,b+1+cnt,zw)-b;
ret+=Qll(root[r],root[l-1],1,cnt,x,zw);
ret+=Qbg(root[r],root[l-1],1,cnt,x,zw);
if(ret<ans){
fir=l; mi=zw;
ans=ret;
}
}
printf("%lld\n",ans);
for(int i=fir;i<=fir+k-1;++i) a[i]=mi;
for(int i=1;i<=n;++i) printf("%d\n",a[i]);
return 0;
}
[POI2008]砖块Klo的更多相关文章
- [BZOJ1112][POI2008]砖块Klo
[BZOJ1112][POI2008]砖块Klo 试题描述 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 ...
- 【BZOJ1112】[POI2008]砖块Klo Treap
[BZOJ1112][POI2008]砖块Klo Description N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出 ...
- [Bzoj1112][POI2008]砖块Klo(splay)
1112: [POI2008]砖块Klo Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2353 Solved: 831[Submit][Statu ...
- [BZOJ 1112] [POI2008] 砖块Klo 【区间K大】
题目链接:BZOJ - 1112 题目分析 枚举每一个长度为k的连续区间,求出这个区间的最优答案,更新全局答案. 可以发现,这个区间的所有柱子最终都变成这k个数的中位数时最优,那么我们就需要查询这个区 ...
- [BZOJ1112] [POI2008] 砖块Klo (treap)
Description N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另一柱.仓库无限大. 现在希望用最小次 ...
- BZOJ1112[POI2008]砖块Klo——非旋转treap
题目描述 N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另一柱.仓库无限大. 现在希望用最小次数的动作完成任 ...
- 线段树 || BZOJ 1112: [POI2008]砖块Klo
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1112 题解: 希望有连续K柱的高度是一样的,就先把1~K的数扔进线段树(线段树的下标就是数值 ...
- BZOJ 1112 [POI2008]砖块Klo(可持久化线段树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1112 [题目大意] 给出一个数列,对于一个操作,你可以对一个数+1,或者一个数-1, ...
随机推荐
- repaint和reflow的相关知识
一个页面由两部分组成: DOM:描述该页面的结构 render渲染:描述 DOM 节点 (nodes) 在页面上如何呈现 repaint重绘: 当 DOM 元素的属性发生变化 (如 color) 时, ...
- dm8148 开发只boot启动参数vram=128简介
显存 全称显示内存,即显示卡专用内存.显存对于显卡就好比内存对于整台电脑,地位非常重要,它负责存储显示芯片需要处理的各种数据.显存容量的大小.性能的高低,直接影响着电脑的显示效果.目前,工作站显卡常用 ...
- 《深入浅出WPF》笔记——事件篇
如果对事件一点都不了解或者是模棱两可的话,建议先去看张子阳的委托与事件的文章(比较长,或许看完了,也忘记看这一篇了,没事,我会原谅你的)http://www.cnblogs.com/JimmyZhan ...
- 操作XML-dom4j
首先是到dom4j的官网dom4j文件包,下载之后解压如下所示. 在根目录中,找到dom4j-1.6.1jar包,加入到eclipse中的lib文件下,最后build path一下,即可使用相关的方法 ...
- jquery中end()方法的解释
来源:http://www.jquery001.com/jquery-end-method.html 对于end()方法,jQuery文档是这样解释的:jQuery回到最近的一个"破坏性&q ...
- Core Services层
本文转载至 http://jingyan.baidu.com/article/cdddd41c57360853cb00e124.html Core Services层是系统很多部分的基础部分,也许应用 ...
- 【BZOJ3239】Discrete Logging BSGS
[BZOJ3239]Discrete Logging Description Given a prime P, 2 <= P < 231, an integer B, 2 <= B ...
- 《从零开始学Swift》学习笔记(Day 25)——类和结构体定义
原创文章,欢迎转载.转载请注明:关东升的博客 Swift中的类和结构体定义的语法是非常相似的.类使用class关键词定义类,使用struct关键词定义结构体,它们的语法格式如下: class 类名 { ...
- python基础里的那些为什么?
一.执行python脚本的两种方式? 直接在解释器里编写并在解释器里执行 文件编写,并在终端通过 python 路径 这种方式执行 好,我们就以输出hello world这个例子来比较两种方式的不同 ...
- python基础——函数参数
课上老师已经讲过函数(func)的参数(args)传递. 之前学习了根据位置传递对应的参数,下面会介绍其他参数传递方式. 之前的位置传参: def f(a,b,c): return a+b+c pri ...