题面

显然我们需要考虑每一个区间,而这个问题显然我们都会做,这不就是这道题么,也就是说假如中位数是$mid$,区间和是$sum$,那么代价就是$\sum\limits_{i=l}^r |mid-num[i]|$

所以现在我们要维护这样的一个数据结构:支持删除/插入一个数,查询中位数和查询区间和

线段树?平衡树?写不来写不来,对顶堆即可解决

维护一个大根堆存区间中较小的一半数,小根堆存区间中较大的一半数,插入时比较一下两个堆的大小和堆顶元素(细节比较多,有一大坨讨论)。查询中位数就非常方便了,直接查询大根堆堆顶。查询区间和的操作也很好做,开两个变量记录一下就好了。唯一有点问题的是如何删除,因为std::priority_queue只能允许我们操作堆顶元素,解决方法一是手写堆,然而我不会,所以我用第二种方法:打标记。注意每次更新前后标记的下放,然后就做完了。

 #include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,M=;
long long num[N],laz[M];
long long n,k,m,l,r,mid;
long long siz1,siz2,sum1,sum2,ans;
priority_queue<int> heap1;
priority_queue<int,vector<int>,greater<int> > heap2;
void Release()
{
while(!heap1.empty()&&laz[heap1.top()])
laz[heap1.top()]--,heap1.pop();
while(!heap2.empty()&&laz[heap2.top()])
laz[heap2.top()]--,heap2.pop();
}
void Push(long long x)
{
Release();
while(siz2&&siz1<m)
{
long long tpp=heap2.top();
heap2.pop(); heap1.push(tpp);
siz1++,siz2--,sum1+=tpp,sum2-=tpp;
Release();
}
if(!siz1)
heap1.push(x),siz1++,sum1+=x;
else
{
Release();
if(heap1.top()>x)
heap1.push(x),siz1++,sum1+=x;
else
heap2.push(x),siz2++,sum2+=x;
Release();
while(siz1>m)
{
long long tpp=heap1.top();
heap1.pop(); heap2.push(tpp);
siz1--,siz2++,sum1-=tpp,sum2+=tpp;
Release();
}
while(siz2&&siz1<m)
{
long long tpp=heap2.top();
heap2.pop(); heap1.push(tpp);
siz1++,siz2--,sum1+=tpp,sum2-=tpp;
Release();
}
}
}
void Pop(long long x)
{
laz[x]++;
if(heap1.top()>=x) siz1--,sum1-=x;
else siz2--,sum2-=x; Release();
}
long long cost()
{
return sum2-sum1+(k&)*heap1.top();
}
int main ()
{
scanf("%lld%lld",&n,&k),m=(k+)/;
for(int i=;i<=n;i++) scanf("%lld",&num[i]);
for(int i=;i<=k;i++) Push(num[i]);
ans=cost(),l=,r=k,mid=heap1.top();
for(int i=k+;i<=n;i++)
{
Pop(num[i-k]),Push(num[i]);
if(ans>cost()&&cost()>=)
ans=cost(),l=i-k+,r=i,mid=heap1.top();
}
printf("%lld\n",ans);
for(int i=;i<=n;i++)
(i>=l&&i<=r)?printf("%lld\n",mid):printf("%lld\n",num[i]);
return ;
}

解题:POI2008 Building blocks的更多相关文章

  1. HDU—— 5159 Building Blocks

    Problem Description After enjoying the movie,LeLe went home alone. LeLe decided to build blocks. LeL ...

  2. 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 ...

  3. bc.34.B.Building Blocks(贪心)

    Building Blocks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  4. DTD - XML Building Blocks

    The main building blocks of both XML and HTML documents are elements. The Building Blocks of XML Doc ...

  5. 企业架构研究总结(35)——TOGAF架构内容框架之构建块(Building Blocks)

    之前忙于搬家移居,无暇顾及博客,今天终于得闲继续我的“政治课”了,希望之后至少能够补完TOGAF方面的内容.从前面文章可以看出,笔者并无太多能力和机会对TOGAF进行理论和实际的联系,仅可对标准的文本 ...

  6. TOGAF架构内容框架之构建块(Building Blocks)

    TOGAF架构内容框架之构建块(Building Blocks) 之前忙于搬家移居,无暇顾及博客,今天终于得闲继续我的“政治课”了,希望之后至少能够补完TOGAF方面的内容.从前面文章可以看出,笔者并 ...

  7. [翻译]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 ...

  8. 四、Implementation: The Building Blocks 实现:构件

    四.Implementation: The Building Blocks 实现:构件 This is the essential part of this guide. We will introd ...

  9. 2.3 Core Building Blocks 核心构件

    Core Building Blocks 核心构件 DDD mostly focuses on the Domain & Application Layers and ignores the ...

随机推荐

  1. 20155339平措卓玛 Exp2 后门原理与实践

    20155339平措卓玛Exp2 后门原理与实践 基础问题 (1)例举你能想到的一个后门进入到你系统中的可能方式? 答:下载并安装某个程序,这个程序可以正常的并且完整的为我们提供服务,但是在开发改程序 ...

  2. P4175 [CTSC2008]网络管理

    如果没有修改就是简单主席树,有了修改的话因为主席树维护的是到根的一段路径,所以修改操作会修改子树,也就是连续的一段dfn 所以显然树套树一波就没了 极其好写 #include<bits/stdc ...

  3. 6、Docker图形化管理(Portainer)

    一.Portainer简介 Portainer是Docker的图形化管理工具,提供状态显示面板.应用模板快速部署.容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作).事件日志显示.容器控 ...

  4. redis安装命令

    要进入redis的安装目录: cd 目录 安装命令:redis-server.exe --service-install redis.windows.conf --loglevel verbose 卸 ...

  5. Jq_select的操作

    jQuery获取Select选择的Text和Value: 语法解释: $("#select_id").change(function(){//code...}); //为Selec ...

  6. Azure 基础:自定义 Table storage 查询条件

    本文是在 <Azure 基础:Table storage> 一文的基础上介绍如何自定义 Azure Table storage 的查询过滤条件.如果您还不太清楚 Azure Table s ...

  7. python 微信撤回消息

    import itchatfrom itchat.content import *import osimport reimport time# 文件临时存储页rec_tmp_dir = os.path ...

  8. 矩阵分解----Cholesky分解

    矩阵分解是将矩阵拆解成多个矩阵的乘积,常见的分解方法有 三角分解法.QR分解法.奇异值分解法.三角分解法是将原方阵分解成一个上三角矩阵和一个下三角矩阵,这种分解方法叫做LU分解法.进一步,如果待分解的 ...

  9. Go语言简单学习

    GO 支持goroutine 和通道,并且推荐使用消息而不是共享内存来进行并发编程,总体来说,Go语言是一个非常现代化的语言,精小但非常强大 Go语言的主要特性: 1.自动垃圾回收 2.更丰富的内置类 ...

  10. UE4官方行为树快速入门文档解析和修改

    近学习了UE4官方文档的行为树快速入门指南,发现里面的部分逻辑稍稍有点混乱和重叠,于是加入了自己的想法,修改了部分行为树逻辑,优化了其AI寻路能力. 初始的基本操作和资源创建同官方文档一样:1个Fol ...