【枚举】【权值分块】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 ...
随机推荐
- 怎么给word加底纹
- bzoj 3771 Triple FFT 生成函数+容斥
Triple Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 847 Solved: 482[Submit][Status][Discuss] Desc ...
- linux 下查看网卡工作速率
[root@hadoop058 ~]# mii-tool eth0: negotiated 100baseTx-FD, link ok 100M linux 下查看网卡工作速率 Ethtool是用于查 ...
- 使用 FirewallD 构建动态防火墙
使用 FirewallD 构建动态防火墙 FirewallD 提供了支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具.它支持 IPv4, IPv6 防火墙设置以及以太网 ...
- css和javascript中图片路径的不同
之前在写前端代码时,在图片路径的设置那里经常会遇到一个问题.比方说,我 (1)在根目录下面新建了个"images"文夹,里面放了张图片top.gif (2)在根目录下另外新建了两个 ...
- TestRedis
import org.junit.Before; import org.junit.Test; import redis.clients.jedis.Jedis; import java.util.H ...
- .NET之特性和属性(转)
1. 引言 attribute是.NET框架引入的有一技术亮点,因此我们有必要花点时间走进一个发现attribute登堂入室的入口.因为.NET Framework中使用了大量的定制特性来完成代码约定 ...
- 【poj3294-不小于k个字符串中最长公共子串】后缀数组
1.注意每两个串之间的连接符要不一样. 2.分组的时候要注意最后一组啊!又漏了! 3.开数组要考虑连接符的数量.100010是不够的至少要101000. #include<cstdio> ...
- HDU4889 Scary Path Finding Algorithm
Fackyyj loves the challenge phase in TwosigmaCrap(TC). One day, he meet a task asking him to find sh ...
- Sequence(ST表)(洛谷P2048)
超级钢琴 知识储备 在做这道题前,我们先要了解一下ST表(一种离线求区间最值的方法) ST表使用DP实现的,其查询复杂度为O(1). 那么我们怎么用DP实现呢?? 首先,我们设立一个状态f[i][j] ...