题面

显然我们需要考虑每一个区间,而这个问题显然我们都会做,这不就是这道题么,也就是说假如中位数是$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. 20155301 《网络攻防》 Exp5 MSF基础应用

    20155301 <网络攻防> Exp5 MSF基础应用 基础问题 1.用自己的话解释什么是exploit,payload,encode 答:exploit就是利用一些工具的,用来收集目标 ...

  2. 20155333 《网络对抗》Exp2 后门原理与实践

    20155333 <网络对抗>Exp2 后门原理与实践 1.例举你能想到的一个后门进入到你系统中的可能方式? 下载的软件中捆绑有后门: 浏览的网页或其上的小广告: 有些网页会自动安装软件. ...

  3. 【WPF】给TextBox添上Label

    原文:[WPF]给TextBox添上Label 引言     在客户端开发中,要说出现频率大的控件,必定有TextBox的身影.然而在TextBox的旁边通常得有个基友Label,形影不离.为此,我们 ...

  4. spring配置多个事务管理器

    <tx:annotation-driven/> <bean id="transactionManager1" class="org.springfram ...

  5. 汇编 EBP ,ESP 寄存器

    知识点:  CALL框架  EBP寄存器 栈底指针  ESP寄存器 栈顶指针 一.EBP栈底指针 EBP是一个特殊的寄存器,通过EBP+偏移量 可以访问CALL里边的局部变量.它的低16位叫BP ...

  6. W25Q128---读写

    占坑! 总结:通信方式是SPI,读数据可以从任何地方读,写数据和擦出数据需要按照页或者扇区或者簇为单位进行. 写数据:一次最多写一页,如果超出一页数据长度,则分几次完成.例如本芯片一个扇区为4096个 ...

  7. CS190.1x-ML_lab3_linear_reg_student

    这次作业主要是有关监督学习,数据集是来自UCI Machine Learning Repository的Million Song Dataset.我们的目的是训练一个线性回归的模型来预测一首歌的发行年 ...

  8. Java+Netty、Vue+Element-UI实现的即时通信应用 leo-im

    之前工作接触了几个开源的IM产品,再加上曾经用Netty实现过几个服务,于是就有了用Netty实现一个IM的想法,于是用业余时间写了一个IM,和喜欢Netty的程序员们分享. 考虑到方便扩展,在服务端 ...

  9. First day for introducing me

    """ This is first python3 script code for lyp in Bokeyuan __author__="lyp" ...

  10. mgo like的两种写法

    实际上都是围绕正则来写的,看大家喜欢那种写法 package main import ( "fmt" "labix.org/v2/mgo" "labi ...