[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, ... 
随机推荐
- 支付宝热补丁技术— AndFix原理[阿里Hao]
			本文由嵌入式企鹅圈原创团队成员.阿里资深project师Hao分享. 上次我们介绍了用dexposed方案实施热补丁的原理.它本质上就是hook要改动的函数.这样一来在正式版本号公布时就不能直接拿热补 ... 
- tonymillion/Reachability的使用
			tonymillion/Reachability是GitHub上的一个开源工具类,目測是依据Apple的Reachability Demo改写而成. 该类能够測试到某一网络.主机等的可达性,支持Blo ... 
- python导入模块报错:ImportError: No module named mysql.connector(安装 mysql)
			python的版本是 $ python --version Python 2.7.12 报错代码如下 import mysql.connector 报错信息是 ImportError: No modu ... 
- 七、Dockerfile案例一(jdk1.8安装)
			七.Dockerfile案例一(jdk1.8安装) 1 获取一个简单的Docker系统镜像,并建立一个容器. 这里我选择下载CentOS镜像 docker pull centos 通过docker t ... 
- 巨蟒django之权限7:动态生成一级&&二级菜单
			内容回顾: . 权限的控制 . 表结构设计 存权限的信息 用户表 - name 用户名 - pwd 密码 - roles 多对多 角色表 - name - permissions 多对多 权限表 - ... 
- MogoDB 分片键
			MongoDB 根据分片键分割 collection 中的文档,然后分配到分片集群的成员中. 分片键可以是一个存在于每个文件中的索引字段或者复合索引字段. MongoDB 使用不同范围的分片键值来分割 ... 
- 字符串 转 时间戳  unix_timestamp('2018-07-01 0:0:0')
			SELECT FROM_UNIXTIME(createtime,'%Y%m%d') AS d, s.app,SUM(o.val) FROM orders o LEFT JOIN app_type s ... 
- Bootstrap支持的JavaScript插件
			1.导入JavaScript插件 Bootstrap除了包含丰富的Web组件之外,如前面介绍的下拉菜单.按钮组.导航.分页等.他还包括一些JavaScript的插件. Bootstrap的JavaSc ... 
- MySQL中事务的概述ACID了解
			事务可由一条非常简单的SQL语句组成,也可以有一组复杂的SQL语句组成.事务是访问并更新数据库中各种数据项的一个程序执行单元.在事务中操作,要么都做修改,要么都不做,这就是事务的目的,也是事务模型区别 ... 
- 部署samba
			1.首先需要关闭防火墙 2,创建用户名 3.IP地址配置ping下能不能成功 4.yum install samba -y 进行软件包的安装 5,vim修改.etc/samba/smb.conf/的配 ... 
