BZOJ 1112 [POI2008]砖块Klo(可持久化线段树)
【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=1112
【题目大意】
给出一个数列,对于一个操作,你可以对一个数+1,或者一个数-1,
问若使得数列中出现长度为m的连续相同的数,最少需要的操作数。
【题解】
我们发现对于固定区间求最小操作,等价于求区间中数距离中位数差值和最小,
我们发现区间中位数可以利用主席树求区间kth来实现,
同时在主席树上维护权值线段树的区间真值和,那么对于每个区间中的数,
就能分别维护比中位数小的部分的和以及比中位数大的部分的和,
分别与中位数的倍数做加减运算即可。
我们枚举区间的位置,保留最小值,复杂度O(nlogn)。
【代码】
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=100010;
typedef long long LL;
int n,m,i,x,y,z,ans;
int l[N*40],r[N*40],v[N*40],tot,root[N],num[N];
LL s[N*40];
int cmp(int i,int j){return num[i]<num[j];}
int rk[N],sa[N]; //sa:该数字对应原数列的下标
int build(int a,int b){
int x=++tot; v[x]=s[x]=0;
if(a==b)return x;
int mid=(a+b)>>1;
return l[x]=build(a,mid),r[x]=build(mid+1,b),x;
}
// x版本c位置+p,在s中记录+num[sa[c]],统计权值线段树上真值的区间和。
int change(int x,int a,int b,int c,int p){
int y=++tot;v[y]=v[x]+p;s[y]=s[x]+num[sa[c]];
if(a==b)return y;
int mid=(a+b)>>1;
if(c<=mid)l[y]=change(l[x],a,mid,c,p),r[y]=r[x];
else l[y]=l[x],r[y]=change(r[x],mid+1,b,c,p);
return y;
}
int kth(int x,int y,int a,int b,int k){
if(a==b)return a;
int mid=(a+b)>>1;
if(v[l[y]]-v[l[x]]>=k)return kth(l[x],l[y],a,mid,k);
else return kth(r[x],r[y],mid+1,b,k-v[l[y]]+v[l[x]]);
}
LL abs(LL x){return x<0?-x:x;}
LL query(int x,int y,int a,int b,int c){
if(a==b)return 1LL*abs(num[sa[a]]-num[sa[c]])*(v[y]-v[x]);
int mid=(a+b)>>1;
if(c<=mid){
return query(l[x],l[y],a,mid,c)+s[r[y]]-s[r[x]]-1LL*num[sa[c]]*(v[r[y]]-v[r[x]]);
}else{
return query(r[x],r[y],mid+1,b,c)+1LL*num[sa[c]]*(v[l[y]]-v[l[x]])-(s[l[y]]-s[l[x]]);
}
}
int main(){
while(~scanf("%d%d",&n,&m)){
root[0]=0;tot=0;
for(int i=1;i<=n;i++)scanf("%d",num+i);
for(int i=1;i<=n;i++)sa[i]=i;
sort(sa+1,sa+n+1,cmp);
for(int i=1;i<=n;i++)rk[sa[i]]=i;
build(1,n);
for(int i=1;i<=n;i++)root[i]=change(root[i-1],1,n,rk[i],1);
LL ans=0x3f3f3f3f3f3f3f3f;
for(int i=1;i<=n-m+1;i++){
int id=kth(root[i-1],root[i+m-1],1,n,(m+1)>>1);
ans=min(ans,query(root[i-1],root[i+m-1],1,n,id));
}printf("%lld\n",ans);
}return 0;
}
BZOJ 1112 [POI2008]砖块Klo(可持久化线段树)的更多相关文章
- BZOJ 1112: [POI2008]砖块Klo
1112: [POI2008]砖块Klo Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1736 Solved: 606[Submit][Statu ...
- 线段树 || BZOJ 1112: [POI2008]砖块Klo
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1112 题解: 希望有连续K柱的高度是一样的,就先把1~K的数扔进线段树(线段树的下标就是数值 ...
- [BZOJ 1112] [POI2008] 砖块Klo 【区间K大】
题目链接:BZOJ - 1112 题目分析 枚举每一个长度为k的连续区间,求出这个区间的最优答案,更新全局答案. 可以发现,这个区间的所有柱子最终都变成这k个数的中位数时最优,那么我们就需要查询这个区 ...
- bzoj 1112: [POI2008]砖块Klo【对顶堆】
priority_queue实现的对顶堆,细节超级多WA了十几次--但是理论上是最简便的orz其实是我已经不会写平衡树了 枚举左端点,显然要把这一段的高度搞成(l,l+k-1)的高度中位数,所以需要一 ...
- BZOJ 1112: [POI2008]砖块Klo Splay + 性质分析
Code: #include<bits/stdc++.h> using namespace std; #define setIO(s) freopen(s".in",& ...
- BZOJ 1112: [POI2008]砖块Klo1112( BST )
枚举每个长度为k的区间, 然后用平衡树找中位数进行判断, 时间复杂度O(nlogn). 早上起来精神状态不太好...连平衡树都不太会写了...果断去看了会儿番然后就A了哈哈哈 ------------ ...
- 1112: [POI2008]砖块Klo
1112: [POI2008]砖块Klo Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1245 Solved: 426[Submit][Statu ...
- [BZOJ 3123] [SDOI 2013]森林(可持久化线段树+并查集+启发式合并)
[BZOJ 3123] [SDOI 2013]森林(可持久化线段树+启发式合并) 题面 给出一个n个节点m条边的森林,每个节点都有一个权值.有两种操作: Q x y k查询点x到点y路径上所有的权值中 ...
- BZOJ.2653.[国家集训队]middle(可持久化线段树 二分)
BZOJ 洛谷 求中位数除了\(sort\)还有什么方法?二分一个数\(x\),把\(<x\)的数全设成\(-1\),\(\geq x\)的数设成\(1\),判断序列和是否非负. 对于询问\(( ...
随机推荐
- BZOJ1875: [SDOI2009]HH去散步 图上边矩乘
这道题十分的坑…… 我作为一只连矩乘都不太会的渣渣看到这道题就只能神搜了….. 首先说一下普通的矩乘求方案,就是高出邻接矩阵然后一顿快速幂….. 矩乘一般就是一些秘制递推….. 再说一下这道题,我们可 ...
- at用法小记
By francis_hao Aug 22,2017 at – 设置稍后执行的作业. 概要 at [-V] [-f file] [-mMlv] timespec...at [-V] [-f ...
- POJ1417:True Liars(DP+带权并查集)
True Liars Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- poj 2378 Tree Cutting 树形dp
After Farmer John realized that Bessie had installed a "tree-shaped" network among his N ( ...
- ansible+docker
1.准备镜像: 1007 docker run -itd --name client2 ff37bc5ab732 1008 docker run -itd --name client ff37bc5a ...
- 使用eclipse插件创建一个web project
使用eclipse插件创建一个web project 首先创建一个Maven的Project如下图 我们勾选上Create a simple project (不使用骨架) 这里的Packing 选择 ...
- auto login vpnclient bat
@echo offstart "" /b "C:\Program Files (x86)\Cisco Systems\VPN Client\vpngui.exe" ...
- SpringMVC学习 -- REST
REST:表现层状态转化. REST 是目前最流行的一种互联网软件架构.他结构清晰.符合标准.易于理解.扩展方便 , 所以正得到越来越多网站的采用. 状态转化:浏览器 form 表单只支持 GET 和 ...
- GitLab 密码重设
内容全部来自: CSDN bisal GitLab 密码重设方法 假设注册邮箱为: abc@test.com 步骤 1) 登录 git 服务器 2) 执行: gitlab-rails console ...
- NGINX : 如何屏蔽未被定义的虚拟主机的访问
参考: [ how to prevent undefined server names ] nginx 的默认虚拟主机 Nginx 支持基于域名和端口的虚拟主机(virtual host), 根据获取 ...