[Bzoj1112][POI2008]砖块Klo(splay)
1112: [POI2008]砖块Klo
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 2353 Solved: 831
[Submit][Status][Discuss]
Description
N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另一柱.仓库无限大. 现在希望用最小次数的动作完成任务.
Input
第一行给出N,K. (1 ≤ k ≤ n ≤ 100000), 下面N行,每行代表这柱砖的高度.0 ≤ hi ≤ 1000000
Output
最小的动作次数
Sample Input
Sample Output
HINT
原题还要求输出结束状态时,每柱砖的高度.本题略去.
分析:
splay求中位数。
AC代码:
# include <iostream>
# include <cstdio>
# include <cstring>
using namespace std;
typedef long long LL;
const int N = 1e5 + ;
LL s[N],ret = 1e18;int n,K,root,cnt;
struct node{
int ch[];
int fa;
int sz;LL val,sum;
node(){}
node(LL val):fa(),sz(),val(val),sum(sum){ch[] = ch[] = ;}
}a[N];
void push(int x)
{
a[x].sz = a[a[x].ch[]].sz + a[a[x].ch[]].sz + ;
a[x].sum = a[a[x].ch[]].sum + a[a[x].ch[]].sum + a[x].val;
}
void rotate(int now,int d)
{
int pre = a[now].fa,g = a[pre].fa,nex = a[now].ch[d];
a[pre].ch[d ^ ] = nex;
if(nex)a[nex].fa = pre;
a[now].fa = g;
if(g)a[g].ch[a[g].ch[] == pre] = now;
a[pre].fa = now;a[now].ch[d] = pre;
push(pre);push(now);
}
void splay(int now)
{
int pre,g;
while(a[now].fa)
{
pre = a[now].fa,g = a[pre].fa;
if(g && !((a[pre].ch[] == now) ^ (a[g].ch[] == pre)))rotate(pre,a[pre].ch[] == now);
rotate(now,a[pre].ch[] == now);
}
root = now;
}
void insert(LL val)
{
if(!root){a[++cnt] = node(val);root = cnt;return;}
int now = root,pre;
while(now)
{
pre = now;
now = a[now].ch[val > a[now].val];
}
a[++cnt] = node(val);a[cnt].fa = pre;
a[pre].ch[val > a[pre].val] = cnt;
splay(cnt);
}
void erase(int now)
{
splay(now);
if(!a[now].ch[] || !a[now].ch[]){root = a[now].ch[] + a[now].ch[];}
else
{
int p = a[now].ch[];
while(a[p].ch[])p = a[p].ch[];
a[p].ch[] = a[now].ch[];
a[a[now].ch[]].fa = p;
root = a[now].ch[];a[root].fa = ;
splay(a[now].ch[]);
}
a[root].fa = ;
}
int find(int k)
{
int now = root;
while(k > )
{
if(a[a[now].ch[]].sz < k){k -= a[a[now].ch[]].sz;k--;if(k > )now = a[now].ch[];}
else now = a[now].ch[];
}
return now;
}
int main()
{
scanf("%d %d",&n,&K);
for(int i = ;i <= n;i++)scanf("%lld",&s[i]);
for(int i = ;i < K;i++)insert(s[i]);
for(int i = K;i <= n;i++)
{
if(i - K)erase(i - K);
insert(s[i]);
int now = find((K + ) >> );
splay(now);
LL s1 = a[a[now].ch[]].sz,s2 = a[a[now].ch[]].sz;
LL pre = a[a[now].ch[]].sum,bef = a[a[now].ch[]].sum;
if(s1 * a[now].val - pre + bef - s2 * a[now].val < ret)ret = s1 * a[now].val - pre + bef - s2 * a[now].val;
}
printf("%lld\n",ret);
}
[Bzoj1112][POI2008]砖块Klo(splay)的更多相关文章
- [BZOJ1112][POI2008]砖块Klo
[BZOJ1112][POI2008]砖块Klo 试题描述 N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另 ...
- BZOJ 1112: [POI2008]砖块Klo Splay + 性质分析
Code: #include<bits/stdc++.h> using namespace std; #define setIO(s) freopen(s".in",& ...
- [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:从仓库中拿出 ...
- 1112: [POI2008]砖块Klo
1112: [POI2008]砖块Klo Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1245 Solved: 426[Submit][Statu ...
- BZOJ 1112: [POI2008]砖块Klo
1112: [POI2008]砖块Klo Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1736 Solved: 606[Submit][Statu ...
随机推荐
- XML解析(一) DOM解析
XML解析技术主要有三种: (1)DOM(Document Object Model)文档对象模型:是 W3C 组织推荐的解析XML 的一种方式,即官方的XML解析技术. (2)SAX(Simple ...
- React初识整理(三)--受控组件解决方法
1. 受控组件:组件处于受控制状态,不可更改输入框内的值. 2. 什么情况下会让组件变成受控组件? - 文本框设置了value属性的时候 - 单选框或多选框设置了checked属性的时候. 3. 如何 ...
- 【单调栈 动态规划】bzoj1057: [ZJOI2007]棋盘制作
好像还有个名字叫做“极大化”? Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源 于易经的思想,棋盘是一个8*8大小的黑白相间的 ...
- iptables IP流量统计
最后是使用ipset进行流量统计,iptaccount资料太少而且还跟网上说明的操作情况不相符,继续看源码分析组长老大都不高兴.ipset使用帮助 1. 创建ipset集合:ipset create ...
- solr DIH 设置定时索引
1 web.xml中加入 web.xml所在目录 /opt/solr-7.7.1/server/solr-webapp/webapp/WEB-INF <listener> <list ...
- [转]ARM平台下独占访问指令LDREX和STREX
参考:ARM平台下独占访问指令LDREX和STREX的原理与使用详解 全文转载如下: 为了实现线程间同步,一般都要在执行关键代码段之前加互斥(Mutex)锁,且在执行完关键代码段之后解锁.为了实现所谓 ...
- JavaScript正则表达式-反向引用
使用括号“()”进行分组,使子表达式(子模式)可以作为整体独立被修饰,子表达式所匹配的结果会被记录下来并可以单独被访问. /(a(b(cd){2})+)EF/ 则各引用分别对应: \1 对应(a(b ...
- PAT Basic 1069
1069 微博转发抽奖 小明 PAT 考了满分,高兴之余决定发起微博转发抽奖活动,从转发的网友中按顺序每隔 N 个人就发出一个红包.请你编写程序帮助他确定中奖名单. 输入格式: 输入第一行给出三个正整 ...
- 算法学习记录-图(DFS BFS)
图: 目录: 1.概念 2.邻接矩阵(结构,深度/广度优先遍历) 3.邻接表(结构,深度/广度优先遍历) 图的基本概念: 数据元素:顶点 1.有穷非空(必须有顶点) 2.顶点之间为边(可空) 无向图: ...
- wei UI使用
1.前言 通过前面系列文章的学习与讲解,相信大家已经对微信的开发有了一个全新的认识.后端基本能够基于盛派的第三方sdk搞定大部分事宜,剩下的就是前端了.关于手机端的浏览器的兼容性问题相信一直是开发者们 ...