解题:POI2008 Building blocks
显然我们需要考虑每一个区间,而这个问题显然我们都会做,这不就是这道题么,也就是说假如中位数是$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的更多相关文章
- HDU—— 5159 Building Blocks
Problem Description After enjoying the movie,LeLe went home alone. LeLe decided to build blocks. LeL ...
- 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方面的内容.从前面文章可以看出,笔者并 ...
- [翻译]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 ...
随机推荐
- 【转载】WINAPI宏
原文:http://blog.sina.com.cn/s/blog_3f27dee60100qi4j.html 一直搞不懂为什么在函数前面加上WINAPI.CALLBACK等是什么意思 又不是返回值 ...
- Codeforces 948D Perfect Security(字典树)
题目链接:Perfect Security 题意:给出N个数代表密码,再给出N个数代表key.现在要将key组排序,使key组和密码组的亦或所形成的组字典序最小. 题解:要使密码组里面每个数都找到能使 ...
- FIFO IP核
转载: 说白了,IP核就是别人做好了的硬件模块,提供完整的用户接口和说明文档,更复杂的还有示例工程,你只要能用好这个IP核,设计已经完成一半了.说起来容易,从冗长的英文文档和网上各个非标准教程中汲取所 ...
- 对 JavaScript 中的5种主要的数据类型进行值复制
定义一个函数 clone(),可以对 JavaScript 中的5种主要的数据类型(包括 Number.String.Object.Array.Boolean)进行值复制 使用 typeof 判断值得 ...
- jenkins pipeline 部署
一.git 版本控制结合jenkins 发布 sh-4.2$ git branch sh-4.2$ git chekout master sh-4.2$ git tag v1.1 sh-4.2$ gi ...
- Kaggle: Google Analytics Customer Revenue Prediction EDA
前言 内容提要 本文为Kaggle竞赛 Google Analytics Customer Revenue Prediction 的探索性分析 题目要求根据历史顾客访问GStore的数据,预测其中部分 ...
- Go语言简单学习
GO 支持goroutine 和通道,并且推荐使用消息而不是共享内存来进行并发编程,总体来说,Go语言是一个非常现代化的语言,精小但非常强大 Go语言的主要特性: 1.自动垃圾回收 2.更丰富的内置类 ...
- PAT甲题题解-1126. Eulerian Path (25)-欧拉回路+并查集判断图的连通性
题目已经告诉如何判断欧拉回路了,剩下的有一点要注意,可能图本身并不连通. 所以这里用并查集来判断图的联通性. #include <iostream> #include <cstdio ...
- BugPhobia开发篇章:Beta阶段第I次Scrum Meeting
0x01 :Scrum Meeting基本摘要 Beta阶段第一次Scrum Meeting 敏捷开发起始时间 2015/12/10 00:00 A.M. 敏捷开发终止时间 2015/12/12 23 ...
- 【Beta阶段】第一次Scrum Meeting!
本次会议为第一次Scrum Meeting会议~ 会议时长:20分 会议地点:依旧是7公寓1楼会客室 昨日任务一览 明日任务一览 刘乾 预定任务:(未完成)#128 学习如何在Github上自动构 ...