[POI2008]KLO-Building blocks
题目描述
N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另一柱.仓库无限大. 现在希望用最小次数的动作完成任务.你还要求输出结束状态时,每柱砖的高度。
Solution
这题相当于我们滑动一个大小为k的窗口,我们可以任意改动每摞砖的高度,那么最优高度为多少呢,很显然是中位数。
所以这题变成了一道大水题,维护一个数据结构,支持插入,删除,查K大。
Code
#include<iostream>
#include<cstdio>
#include<algorithm>
#define N 100004
using namespace std;
int n,a[N],num[N<<],k,top,jue;
long long tr[N<<],ans=0x7f7f7f7f,b[N],ansn;
long long q(int cnt,int l,int r,int L,int R){
if(L>R)return ;
if(l>=L&&r<=R)return tr[cnt];
int mid=(l+r)>>;
long long ans=;
if(mid>=L)ans+=q(cnt<<,l,mid,L,R);
if(mid<R)ans+=q(cnt<<|,mid+,r,L,R);
return ans;
}
int qsum(int cnt,int l,int r,int L,int R){
if(L>R)return ;
if(l>=L&&r<=R)return num[cnt];
int mid=(l+r)>>;
int ans=;
if(mid>=L)ans+=qsum(cnt<<,l,mid,L,R);
if(mid<R)ans+=qsum(cnt<<|,mid+,r,L,R);
return ans;
}
void add(int cnt,int l,int r,int x,int tag){
if(l==r){tr[cnt]+=b[x]*tag;num[cnt]+=tag;return;}
int mid=(l+r)>>;
if(mid>=x)add(cnt<<,l,mid,x,tag);
else add(cnt<<|,mid+,r,x,tag);
tr[cnt]=tr[cnt<<]+tr[cnt<<|];
num[cnt]=num[cnt<<]+num[cnt<<|];
}
int find(int cnt,int l,int r,int k){
if(l==r)return l;
int mid=(l+r)>>;
if(num[cnt<<]>=k)return find(cnt<<,l,mid,k);
else return find(cnt<<|,mid+,r,k-num[cnt<<]);
}
int main(){
scanf("%d%d",&n,&k);
for(int i=;i<=n;++i)scanf("%d",&a[i]),b[i]=a[i];
sort(b+,b+n+);
top=unique(b+,b+n+)-b-;
for(int i=;i<=n;++i)a[i]=lower_bound(b+,b+top+,a[i])-b;
for(int i=;i<=k;++i)add(,,top,a[i],);
ans=2e18;
long long sum=(k+)/;
for(int i=k;i<=n;++i){
int x=find(,,top,sum);
long long aa=b[x]*qsum(,,top,,x-)-q(,,top,,x-)+q(,,top,x+,top)-b[x]*qsum(,,top,x+,top);
if(aa<ans){
ans=aa;
jue=i;
ansn=b[x];
}
add(,,top,a[i+],);add(,,top,a[i-k+],-);
}
printf("%lld\n",ans);
for(int i=;i<jue-k+;++i)printf("%d\n",b[a[i]]);
for(int i=jue-k+;i<=jue;++i)printf("%d\n",ansn);
for(int i=jue+;i<=n;++i)printf("%d\n",b[a[i]]);
return ;
}
[POI2008]KLO-Building blocks的更多相关文章
- Intel® Threading Building Blocks (Intel® TBB) Developer Guide 中文 Parallelizing Data Flow and Dependence Graphs并行化data flow和依赖图
https://www.threadingbuildingblocks.org/docs/help/index.htm Parallelizing Data Flow and Dependency G ...
- bc.34.B.Building Blocks(贪心)
Building Blocks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- DTD - XML Building Blocks
The main building blocks of both XML and HTML documents are elements. The Building Blocks of XML Doc ...
- 企业架构研究总结(35)——TOGAF架构内容框架之构建块(Building Blocks)
之前忙于搬家移居,无暇顾及博客,今天终于得闲继续我的“政治课”了,希望之后至少能够补完TOGAF方面的内容.从前面文章可以看出,笔者并无太多能力和机会对TOGAF进行理论和实际的联系,仅可对标准的文本 ...
- TOGAF架构内容框架之构建块(Building Blocks)
TOGAF架构内容框架之构建块(Building Blocks) 之前忙于搬家移居,无暇顾及博客,今天终于得闲继续我的“政治课”了,希望之后至少能够补完TOGAF方面的内容.从前面文章可以看出,笔者并 ...
- HDU—— 5159 Building Blocks
Problem Description After enjoying the movie,LeLe went home alone. LeLe decided to build blocks. LeL ...
- [翻译]Review——How JavaScript works:The building blocks of Web Workers
原文地址:https://blog.sessionstack.com/how-javascript-works-the-building-blocks-of-web-workers-5-cases-w ...
- 四、Implementation: The Building Blocks 实现:构件
四.Implementation: The Building Blocks 实现:构件 This is the essential part of this guide. We will introd ...
- 2.3 Core Building Blocks 核心构件
Core Building Blocks 核心构件 DDD mostly focuses on the Domain & Application Layers and ignores the ...
- 解题:POI2008 Building blocks
题面 显然我们需要考虑每一个区间,而这个问题显然我们都会做,这不就是这道题么,也就是说假如中位数是$mid$,区间和是$sum$,那么代价就是$\sum\limits_{i=l}^r |mid-num ...
随机推荐
- opencv2\core\cuda.hpp(106): error C2059: 语法错误:“常量”
在 cuda.hpp 中, virtual void free(GpuMat* mat) = 0; -> virtual void _free(GpuMat* mat) = 0;
- Eclipse中Maven的简单使用
一.Maven的安装 检查自己的电脑是否安装了maven,在cmd中输入 mvn -v 命令即可查看 安装配置maven 1.解压部署Maven核心程序 ①检查JAVA_HOME环境变量 C:\Wi ...
- javascript深入浅出——学习笔记(六种数据类型和隐式转换)
在慕课之前学过JS深入浅出,最近发现很多东西都记不太清楚了,再复习一遍好了,感觉这个课程真的超级棒的,做做笔记,再添加一些学习内容
- scrapy全站爬取拉勾网及CrawSpider介绍
一.指定模板创建爬虫文件 命令 创建成功后的模板,把http改为https 二.CrawSpider源码介绍 1.官网介绍: 这是用于抓取常规网站的最常用的蜘蛛,因为它通过定义一组规则为跟踪链接提供了 ...
- Laravel从入门到精通
1. Laravel框架的下载安装 例如: 在D:\test\laravel目录下新建一个目录为test_laravel 第一步,下载laravel框架 在D:\test\laravel\test_l ...
- falsk 项目中日志设置
app/__init__.py: 1 import logging from logging.handlers import RotatingFileHandler ''' 开发中使用DEBUG级别, ...
- jQuery 获取url中的参数
//获取url中的参数 function getUrlParam(name) { var reg = new RegExp("(^|&)" + name + "= ...
- Nginx 浏览器缓存
L:97 一般都是 同时使用 浏览器与Nginx缓存
- windoows ftp的自动上传bat
@echo off set P=%cd% #获取脚本当前文件路径 del /f /s /q %P%\tmp.txt set Y=%DATE:~0,4% #获取年 set M=%DATE:~5,2% # ...
- mpvue——引入antv-F2图表
踩坑中~ 官方文档 https://www.yuque.com/antv/f2/intro 毕竟不像echarts接触过,所以还是先看看文档较好 github https://github.com/s ...