题目

爆炸\(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的更多相关文章

  1. [BZOJ1112][POI2008]砖块Klo

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

  2. BZOJ 1112: [POI2008]砖块Klo

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

  3. 1112: [POI2008]砖块Klo

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Nginx区分PC或手机访问不同网站

    近几年来,随着手机和pad的普及,越来越多的用户选择使用移动客户端访问网站,而为了获取更好的用户体验,就需要针对不同的设备显示出最合适的匹配,这样就是近年来流行的“响应式web设计”. 响应式web设 ...

  2. Eclipse 关闭项目

    Eclipse 关闭项目 为什么要关闭项目? Eclipse 工作空间包含了多个项目.一个项目可以是关闭或开启状态. 项目打开过多影响有: 消耗内存 占用编译时间:在删除项目.class 文件(Cle ...

  3. 自定义实现wcf的用户名密码验证

    目前wcf分为[传输层安全][消息层安全]两种,本身也自带的用户名密码验证的功能,但是ms为了防止用户名密码明文在网络上传输,所以,强制要求一旦使用[用户名密码]校验功能,则必须使用证书,按照常理讲, ...

  4. Cut the rope

    http://acm.nyist.net/JudgeOnline/problem.php?pid=651 描述We have a rope whose length is L. We will cut ...

  5. AsyncTask机制学习

    其内容可以参考http://blog.csdn.net/webgeek/article/details/17298237 ,首先创建一个AsyncTask类 class GetFaceDetectTa ...

  6. LeetCode Problem 136:Single Number

    描述:Given an array of integers, every element appears twice except for one. Find that single one. Not ...

  7. hihocoder 1279(状压)

    坑爹的题目.不过不能说不是一道挺好的题目. 坑主要坑在,妹的我一样的复杂度,写的姿势略差了点然后就一直超时. 比赛的时候我还直接就看错题目,把AND运算看成了OR...还敲完交了一发. 这题很容易想到 ...

  8. Win7系统安装 MySQL 5.7.23

    1. 下载 MySQL 5.7版本:https://dev.mysql.com/downloads/mysql/5.7.html#downloads 2. 解压到指定文件夹,mysql根目录下创建my ...

  9. 《从零开始学Swift》学习笔记(Day 46)——下标重写

    原创文章,欢迎转载.转载请注明:关东升的博客 下标是一种特殊属性.子类属性重写是重写属性的getter和setter访问器,对下标的重写也是重写下标的getter和setter访问器. 下面看一个示例 ...

  10. Vue父组件调用子组件的方法

    vue中如果父组件想调用子组件的方法,可以在子组件中加上ref,然后通过this.$refs.ref.method调用,例如: 父组件: <template> <div @click ...