【枚举】【权值分块】bzoj1112 [POI2008]砖块Klo
枚举长度为m的所有段,尝试用中位数更新答案。
所以需要数据结构,支持查询k大,以及大于/小于 k大值 的数的和。
平衡树、权值线段树、权值分块什么的随便呢。
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
struct Point{int v,p;}t[];
bool operator < (const Point &a,const Point &b){return a.v<b.v;}
int sumv[],ma[],en,a[],b[],tot[],l[],r[],num[],sum=,K,n,m;
ll ans=,tAns;
void makeblock()
{
int sz=sqrt(en); if(!sz) sz=;
for(;sum*sz<en;++sum)
{
l[sum]=r[sum-]+; r[sum]=sum*sz;
for(int i=l[sum];i<=r[sum];++i) num[i]=sum;
}
l[sum]=r[sum-]+; r[sum]=en;
for(int i=l[sum];i<=r[sum];++i) num[i]=sum;
}
void Insert(const int &x){++b[x]; ++tot[num[x]]; sumv[num[x]]+=(ll)ma[x];}
void Delete(const int &x){--b[x]; --tot[num[x]]; sumv[num[x]]-=(ll)ma[x];}
int Query(const int &x)
{
int cnt=; ll now=;
for(int i=;;i++)
{
cnt+=tot[i]; now+=sumv[i];
if(cnt>=x)
{
cnt-=tot[i]; now-=sumv[i];
for(int j=l[i];;j++)
{
cnt+=b[j]; now+=(ll)ma[j]*(ll)b[j];
if(cnt>=x)
{
cnt-=b[j]; now-=(ll)ma[j]*(ll)b[j];
tAns=((ll)ma[j]*(ll)cnt-now);
return j;
}
}
}
}
}
void Next_Sum(const int &x)
{
int cnt=; ll now=;
for(int i=x+;i<=r[num[x]];++i) {cnt+=b[i]; now+=(ll)ma[i]*(ll)b[i];}
for(int i=num[x]+;i<=sum;++i) {cnt+=tot[i]; now+=sumv[i];}
tAns+=(now-(ll)ma[x]*(ll)cnt);
}
int main()
{
scanf("%d%d",&n,&m); K=(m>>)+;
for(int i=;i<=n;++i)
{
scanf("%d",&t[i].v);
t[i].p=i;
} sort(t+,t+n+);
ma[a[t[].p]=++en]=t[].v;
for(int i=;i<=n;++i)
{
if(t[i].v!=t[i-].v) ++en;
ma[a[t[i].p]=en]=t[i].v;
} makeblock();
for(int i=;i<=m;++i) Insert(a[i]);
int t=Query(K); Next_Sum(t); ans=min(ans,tAns);
for(int i=m+;i<=n;++i)
{
Delete(a[i-m]); Insert(a[i]);
int t=Query(K);
Next_Sum(t);
ans=min(ans,tAns);
} printf("%lld\n",ans);
return ;
}
【枚举】【权值分块】bzoj1112 [POI2008]砖块Klo的更多相关文章
- [BZOJ1112][POI2008]砖块Klo
[BZOJ1112][POI2008]砖块Klo 试题描述 N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另 ...
- [Bzoj1112][POI2008]砖块Klo(splay)
1112: [POI2008]砖块Klo Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2353 Solved: 831[Submit][Statu ...
- 【主席树】bzoj1112: [POI2008]砖块Klo
数据结构划一下水 Description N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另一柱.仓库无限大. ...
- [BZOJ1112] [POI2008] 砖块Klo (treap)
Description N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另一柱.仓库无限大. 现在希望用最小次 ...
- BZOJ1112[POI2008]砖块Klo——非旋转treap
题目描述 N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另一柱.仓库无限大. 现在希望用最小次数的动作完成任 ...
- 【BZOJ1112】[POI2008]砖块Klo Treap
[BZOJ1112][POI2008]砖块Klo Description N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出 ...
- 1112: [POI2008]砖块Klo
1112: [POI2008]砖块Klo Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1245 Solved: 426[Submit][Statu ...
- 【DFS序】【莫队算法】【权值分块】bzoj2809 [Apio2012]dispatching
题意:在树中找到一个点i,并且找到这个点子树中的一些点组成一个集合,使得集合中的所有点的c之和不超过M,且Li*集合中元素个数和最大 首先,我们将树处理出dfs序,将子树询问转化成区间询问. 然后我们 ...
- BZOJ 1112: [POI2008]砖块Klo
1112: [POI2008]砖块Klo Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1736 Solved: 606[Submit][Statu ...
随机推荐
- 第五届华中区程序设计邀请赛暨武汉大学第十四届校赛 网络预选赛 A
Problem 1603 - Minimum Sum Time Limit: 2000MS Memory Limit: 65536KB Total Submit: 564 Accepted: ...
- CentOS 安装 debuginfo-install
安装debuginfo相关的包步骤如下: 1. 修改文件/etc/yum.repos.d/CentOS-Debuginfo.repo中的enabled参数,将其值修改为1 2. 使用命令: yum i ...
- expect 实现本地到远程的scp
expect文件demo 令文件名为test.exp #!/usr/bin/expect -f set timeout -1 set pwd " set src_file [lindex $ ...
- javascript中Date使用总结(转)
//全局函数 Date //Date 类的静态方法 Date.parse Date.UTC //Date 对象的建立方法 new Date() new Date(毫秒数) new Date(标准时间格 ...
- 关于javascript中的this 一段小实例深有体会啊
先声明鄙人正在努力的把脚抬进门来,说的都是比较粗浅的知识,但都是我实践中得出的体会,很深刻. 正在自学中挣扎的DOG. 先看段代码: function highlightRows() { if(!d ...
- input输入浮动提示
html代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- Python学习笔记 - day3 - 数据类型及运算符
Python的数据类型 计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形.音频.视频.网页等各种各样的数据,不同 ...
- linux C 中的volatile使用【转】
转自:http://blog.csdn.net/sukhoi27smk/article/details/38020583 一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器 ...
- strncpy 引起的思考,重新认识了strncpy这个函数【转】
转自:http://blog.csdn.net/edwardlulinux/article/details/47134513 版权声明:本文为博主原创文章,未经博主允许不得转载. 首先来看一个司空见惯 ...
- 《Java编程思想》笔记 第四章 控制执行流程
1.true和false if--else if--else, while, do--while 都使用条件表达式的真假来决定执行路径. Java不允许数字作为真假判断,C和C++可以非0即真. 2. ...