[BZOJ 1112] [POI2008] 砖块Klo 【区间K大】
题目链接:BZOJ - 1112
题目分析
枚举每一个长度为k的连续区间,求出这个区间的最优答案,更新全局答案。
可以发现,这个区间的所有柱子最终都变成这k个数的中位数时最优,那么我们就需要查询这个区间的中位数了。
找到中位数之后,我们还应该求出这个区间内小于中位数的数的和,大于中位数的数的和,从而求出操作步数。
这些需要求的值可以用线段树或平衡树来写,我写的是线段树,但是实际上这是一道POI的题目,在MAIN上的空间限制只有35MB,线段树应该是不行的。
因为平衡树只需要 O(n) 空间,所以平衡树才是正解。
代码
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cstdio> using namespace std; const int MaxN = 100000 + 5, MaxNode = 100000 * 20 + 15, MN = 1000000 + 5; typedef long long LL; int n, k, Index, Root;
int A[MaxN], T[MaxNode], Son[MaxNode][2]; const LL INF = 999999999999; LL Ans;
LL Sum[MaxNode]; inline LL gmin(LL a, LL b) {return a < b ? a : b;} inline void Read(int &Num)
{
char c; c = getchar();
while (c < '0' || c > '9') c = getchar();
Num = c - '0'; c = getchar();
while (c >= '0' && c <= '9')
{
Num = Num * 10 + c - '0';
c = getchar();
}
} void Add(int &x, int s, int t, int Pos, int Num)
{
if (x == 0) x = ++Index;
T[x] += Num;
Sum[x] += (LL)Pos * (LL)Num;
if (s == t) return;
int m = (s + t) >> 1;
if (Pos <= m) Add(Son[x][0], s, m, Pos, Num);
else Add(Son[x][1], m + 1, t, Pos, Num);
} int Kth(int x, int s, int t, int k)
{
if (s == t) return s;
int ret, m = (s + t) >> 1;
if (T[Son[x][0]] >= k) ret = Kth(Son[x][0], s, m, k);
else ret = Kth(Son[x][1], m + 1, t, k - T[Son[x][0]]);
return ret;
} LL GetSum(int x, int s, int t, int l, int r)
{
if (l <= s && r >= t) return Sum[x];
int m = (s + t) >> 1;
LL ret = 0ll;
if (l <= m && Son[x][0]) ret += GetSum(Son[x][0], s, m, l, r);
if (r >= m + 1 && Son[x][1]) ret += GetSum(Son[x][1], m + 1, t, l, r);
return ret;
} int GetNum(int x, int s, int t, int l, int r)
{
if (l <= s && r >= t) return T[x];
int m = (s + t) >> 1;
int ret = 0;
if (l <= m && Son[x][0]) ret += GetNum(Son[x][0], s, m, l, r);
if (r >= m + 1 && Son[x][1]) ret += GetNum(Son[x][1], m + 1, t, l, r);
return ret;
} int main()
{
scanf("%d%d", &n, &k);
for (int i = 1; i <= n; ++i) Read(A[i]);
Root = Index = 0;
A[0] = 0;
for (int i = 0; i <= k - 1; ++i) Add(Root, 0, MN, A[i], 1);
Ans = INF;
int t = k / 2 + 1, Temp;
LL Now;
for (int i = k; i <= n; ++i)
{
Add(Root, 0, MN, A[i - k], -1);
Add(Root, 0, MN, A[i], 1);
Temp = Kth(Root, 0, MN, t);
Now = (LL)GetNum(Root, 0, MN, 0, Temp - 1) * (LL)Temp - GetSum(Root, 0, MN, 0, Temp - 1);
Now += GetSum(Root, 0, MN, Temp + 1, MN) - (LL)GetNum(Root, 0, MN, Temp + 1, MN) * (LL)Temp;
Ans = gmin(Ans, Now);
}
printf("%lld\n", Ans);
return 0;
}
[BZOJ 1112] [POI2008] 砖块Klo 【区间K大】的更多相关文章
- BZOJ 1112: [POI2008]砖块Klo
1112: [POI2008]砖块Klo Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1736 Solved: 606[Submit][Statu ...
- BZOJ 1112 [POI2008]砖块Klo(可持久化线段树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1112 [题目大意] 给出一个数列,对于一个操作,你可以对一个数+1,或者一个数-1, ...
- 线段树 || BZOJ 1112: [POI2008]砖块Klo
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1112 题解: 希望有连续K柱的高度是一样的,就先把1~K的数扔进线段树(线段树的下标就是数值 ...
- BZOJ 1112: [POI2008]砖块Klo Splay + 性质分析
Code: #include<bits/stdc++.h> using namespace std; #define setIO(s) freopen(s".in",& ...
- bzoj 1112: [POI2008]砖块Klo【对顶堆】
priority_queue实现的对顶堆,细节超级多WA了十几次--但是理论上是最简便的orz其实是我已经不会写平衡树了 枚举左端点,显然要把这一段的高度搞成(l,l+k-1)的高度中位数,所以需要一 ...
- 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 1901: Zju2112 Dynamic Rankings 区间k大 带修改 在线 线段树套平衡树
之前写线段树套splay数组版..写了6.2k..然后弃疗了.现在发现还是很水的..嘎嘎.. zju过不了,超时. upd:才发现zju是多组数据..TLE一版才发现.然后改了,MLE...手写内存池 ...
- [Bzoj1112][POI2008]砖块Klo(splay)
1112: [POI2008]砖块Klo Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2353 Solved: 831[Submit][Statu ...
随机推荐
- linux 进程综合指令
1. 查询当前机器运行的进程总数: ps -ef | wc -l ps -ef | grep httpd | wc -l 2. ulimit命令 表 1. ulimit 参数说明 选项 [option ...
- JDK中DNS缓存的分析
在JAVA中使用InetAddress.getByName(String host) 方法来获取给定hostname的IP地址.为了减少DNS解析的请求次数,提高解析效率,InetAddress中提供 ...
- 佛主保佑,永无bug
/* _ooOoo_ o8888888o 88" . "88 ...
- 如何写robots.txt?
robin 发表在 八月 2, 2006 在国内,网站管理者似乎对robots.txt并没有引起多大重视,应一些朋友之请求,今天想通过这篇文章来简单谈一下robots.txt的写作. robots.t ...
- [上传下载] C# UpLoadFiles文件上传类 (转载)
点击下载 UpLoadFiles.zip 主要功能如下 /// <summary> /// 上传文件 /// </summary> /// <param name=&qu ...
- 触发器-Trigger
--触发器的实例: Create Table Student( --学生表 StudentID int primary key, --学号 ...
- MyEclipse-java读取jxl的时候报错OutOfMemoryError
在读取jxl的时候,运行的时候报错: java.lang.OutOfMemoryError: Java heap space at jxl.read.biff.SSTRecord.<in ...
- 数据库性能高校:CPU使用过高(下)
CPU使用率过高的常见原因 查询优化器会尽量从CPU,IO和内存资源成本最小的角度,找到最高效的数据访问方式.如果没有正确的索引,或者写的语句本身就会忽略索引, 又或者不准确的统计信息等情况下,查询计 ...
- (一)问候Struts2
第一节:Struts2 简介 主页:http://struts.apache.org/在用户请求和模块化处理方面以及页面的展现这块,Struts2 发挥的屌炸天作用:相对于传统的Jsp+Servlet ...
- C#有关 字符串方法的使用
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...