[BZOJ1112][POI2008]砖块Klo
[BZOJ1112][POI2008]砖块Klo
试题描述
输入
第一行给出N,K. (1 ≤ k ≤ n ≤ 100000), 下面N行,每行代表这柱砖的高度.0 ≤ hi ≤ 1000000
输出
输入示例
输出示例
数据规模及约定
见“输入”
题解
在滑动的区间内维护中位数以及 ∑比中位数大的数减中位数 和 ∑中位数减比中位数小的数。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <algorithm>
using namespace std; int read() {
int x = 0, f = 1; char c = getchar();
while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }
while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }
return x * f;
} #define maxn 100010
#define oo (1ll << 60)
#define LL long long
struct Node {
int v, r, siz;
LL sum;
Node() {}
Node(int _, int __): v(_), r(__) {}
} ns[maxn];
int ToT, rt, fa[maxn], ch[2][maxn];
void maintain(int o) {
ns[o].siz = 1; ns[o].sum = ns[o].v;
for(int i = 0; i < 2; i++) if(ch[i][o])
ns[o].siz += ns[ch[i][o]].siz, ns[o].sum += ns[ch[i][o]].sum;
return ;
}
void rotate(int u) {
int y = fa[u], z = fa[y], l = 0, r = 1;
if(z) ch[ch[1][z]==y][z] = u;
if(ch[1][y] == u) swap(l, r);
fa[u] = z; fa[y] = u; fa[ch[r][u]] = y;
ch[l][y] = ch[r][u]; ch[r][u] = y;
maintain(y); maintain(u);
return ;
}
void insert(int& o, int v) {
if(!o) {
ns[o = ++ToT] = Node(v, rand());
return maintain(o);
}
bool d = v > ns[o].v;
insert(ch[d][o], v); fa[ch[d][o]] = o;
if(ns[ch[d][o]].r > ns[o].r) {
int t = ch[d][o];
rotate(t); o = t;
}
return maintain(o);
}
void del(int& o, int v) {
if(!o) return ;
if(ns[o].v == v) {
if(!ch[0][o] && !ch[1][o]) o = 0;
else if(!ch[0][o]) {
int t = ch[1][o]; fa[t] = fa[o]; o = t;
}
else if(!ch[1][o]) {
int t =ch[0][o]; fa[t] = fa[o]; o = t;
}
else {
bool d = ns[ch[1][o]].r > ns[ch[0][o]].r;
int t = ch[d][o]; rotate(t); o = t;
del(ch[d^1][o], v);
}
}
else {
bool d = v > ns[o].v;
del(ch[d][o], v);
}
return maintain(o);
}
int qkth(int o, int k) {
if(!o) return -1;
int ls = ch[0][o] ? ns[ch[0][o]].siz : 0;
if(k == ls + 1) return ns[o].v;
if(k > ls + 1) return qkth(ch[1][o], k - ls - 1);
return qkth(ch[0][o], k);
}
LL lar(int o, int v) {
if(!o) return 0;
LL s = ch[1][o] ? ns[ch[1][o]].sum : 0;
int ss = ch[1][o] ? ns[ch[1][o]].siz : 0;
if(v < ns[o].v) return s + ns[o].v - (LL)(ss + 1) * v + lar(ch[0][o], v);
return lar(ch[1][o], v);
}
LL sma(int o, int v) {
if(!o) return 0;
LL s = ch[0][o] ? ns[ch[0][o]].sum : 0;
int ss = ch[0][o] ? ns[ch[0][o]].siz : 0;
if(v > ns[o].v) return (LL)(ss + 1) * v - s - ns[o].v + sma(ch[1][o], v);
return sma(ch[0][o], v);
} int A[maxn];
int main() {
int n = read(), k = read();
for(int i = 1; i <= n; i++) A[i] = read(); LL ans = oo;
for(int i = 1; i <= k; i++) insert(rt, A[i]);
int v = qkth(rt, (k >> 1) + 1);
// printf("v: %d %lld\n", v, lar(rt, v) + sma(rt, v));
ans = min(ans, lar(rt, v) + sma(rt, v));
for(int i = k + 1; i <= n; i++) {
insert(rt, A[i]); del(rt, A[i-k]);
v = qkth(rt, (k >> 1) + 1);
// printf("v: %d %lld\n", v, lar(rt, v) + sma(rt, v));
ans = min(ans, lar(rt, v) + sma(rt, v));
} printf("%lld\n", ans); return 0;
}
[BZOJ1112][POI2008]砖块Klo的更多相关文章
- [Bzoj1112][POI2008]砖块Klo(splay)
		
1112: [POI2008]砖块Klo Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2353 Solved: 831[Submit][Statu ...
 - [BZOJ1112] [POI2008] 砖块Klo (treap)
		
Description N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另一柱.仓库无限大. 现在希望用最小次 ...
 - BZOJ1112[POI2008]砖块Klo——非旋转treap
		
题目描述 N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另一柱.仓库无限大. 现在希望用最小次数的动作完成任 ...
 - 【枚举】【权值分块】bzoj1112 [POI2008]砖块Klo
		
枚举长度为m的所有段,尝试用中位数更新答案. 所以需要数据结构,支持查询k大,以及大于/小于 k大值 的数的和. 平衡树.权值线段树.权值分块什么的随便呢. #include<cstdio> ...
 - 【主席树】bzoj1112: [POI2008]砖块Klo
		
数据结构划一下水 Description N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另一柱.仓库无限大. ...
 - 【BZOJ1112】[POI2008]砖块Klo Treap
		
[BZOJ1112][POI2008]砖块Klo Description N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出 ...
 - BZOJ 1112: [POI2008]砖块Klo
		
1112: [POI2008]砖块Klo Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1736 Solved: 606[Submit][Statu ...
 - 1112: [POI2008]砖块Klo
		
1112: [POI2008]砖块Klo Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1245 Solved: 426[Submit][Statu ...
 - [bzoj1112][POI2008]砖块Klo_非旋转Treap
		
砖块Klo bzoj-1112 POI-2008 题目大意:$N$柱砖,希望有连续$K$柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖 ...
 
随机推荐
- 三种方法查看MySQL数据库的版本
			
1.使用-V参数 首先我们想到的肯定就是查看版本号的参数命令,参数为-V(大写字母)或者--version 使用方法: D:\xampp\mysql\bin>mysql -V 或者 D:\xam ...
 - Selenium-java-TestNg-的运行
			
package com.day.www; import org.testng.annotations.AfterClass;import org.testng.annotations.AfterMet ...
 - iframe多层嵌套时获取元素总结
			
父页面获取子页面元素: 注意:onload事件 jQuery获取: $("iframe").contents().find("holder")......; ( ...
 - 在基于vue的webpack脚手架开发中使用了代理转发,结果浏览器发出的请求中不带cookie导致登录时总是session失效怎么办?
			
环境: 有2个业务接口需要转发到82的服务器上: ../user/getCode.do ../user/doLogin.do 现象: 使用上述的 ...
 - AppBox升级进行时 - Any与All的用法(Entity Framework)
			
AppBox 是基于 FineUI 的通用权限管理框架,包括用户管理.职称管理.部门管理.角色管理.角色权限管理等模块. 属于某个角色的用户列表(Any的用法) 使用Subsonic,我们有两种方法获 ...
 - CSS基本知识6-CSS字体
			
首先要考虑的是文本的排版,实际上有这玩意,Word还需要吗?不需要了.我们列下文本所涉及的操作: CSS 文本属性 属性 描述 color 设置文本颜色 direction 设置文本方向. line- ...
 - 教你一招:EXCEL单元格随机生成字母
			
=CHAR(RANDBETWEEN(1,4)+65) 65代表大写字母A,依次类推 1代表从A开始 4代表到D结束
 - a版本冲刺第九天
			
队名:Aruba 队员: 黄辉昌 李陈辉 林炳锋 鄢继仁 张秀锋 章 鼎 学号 昨天完成的任务 今天做的任务 明天要做的任务 困难点 体会 408 着手编辑测试文档,了解测试工具 编写测试用例集 ...
 - COGS396. [网络流24题]魔术球问题(简化版
			
问题描述: 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为 1,2,3,4......的球. (1)每次只能在某根柱子的最上面放球. (2)在同一根柱子中,任何2个相邻球的编号之和为完全平 ...
 - BUAA_OVERWATCH第一次行动前战略部署
			
这太IMBA了! 需求调研问卷的反馈 #define A 调查问卷 A设计背景 随着各种新兴手游的兴起,以及各大直播间内Lying Man的火热,以及各种娱乐方式的发展,传统桌游很好地移植到app上的 ...