枚举长度为m的所有段,尝试用中位数更新答案。

所以需要数据结构,支持查询k大,以及大于/小于 k大值 的数的和。

平衡树、权值线段树、权值分块什么的随便呢。

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cmath>
  4. using namespace std;
  5. typedef long long ll;
  6. struct Point{int v,p;}t[];
  7. bool operator < (const Point &a,const Point &b){return a.v<b.v;}
  8. int sumv[],ma[],en,a[],b[],tot[],l[],r[],num[],sum=,K,n,m;
  9. ll ans=,tAns;
  10. void makeblock()
  11. {
  12. int sz=sqrt(en); if(!sz) sz=;
  13. for(;sum*sz<en;++sum)
  14. {
  15. l[sum]=r[sum-]+; r[sum]=sum*sz;
  16. for(int i=l[sum];i<=r[sum];++i) num[i]=sum;
  17. }
  18. l[sum]=r[sum-]+; r[sum]=en;
  19. for(int i=l[sum];i<=r[sum];++i) num[i]=sum;
  20. }
  21. void Insert(const int &x){++b[x]; ++tot[num[x]]; sumv[num[x]]+=(ll)ma[x];}
  22. void Delete(const int &x){--b[x]; --tot[num[x]]; sumv[num[x]]-=(ll)ma[x];}
  23. int Query(const int &x)
  24. {
  25. int cnt=; ll now=;
  26. for(int i=;;i++)
  27. {
  28. cnt+=tot[i]; now+=sumv[i];
  29. if(cnt>=x)
  30. {
  31. cnt-=tot[i]; now-=sumv[i];
  32. for(int j=l[i];;j++)
  33. {
  34. cnt+=b[j]; now+=(ll)ma[j]*(ll)b[j];
  35. if(cnt>=x)
  36. {
  37. cnt-=b[j]; now-=(ll)ma[j]*(ll)b[j];
  38. tAns=((ll)ma[j]*(ll)cnt-now);
  39. return j;
  40. }
  41. }
  42. }
  43. }
  44. }
  45. void Next_Sum(const int &x)
  46. {
  47. int cnt=; ll now=;
  48. for(int i=x+;i<=r[num[x]];++i) {cnt+=b[i]; now+=(ll)ma[i]*(ll)b[i];}
  49. for(int i=num[x]+;i<=sum;++i) {cnt+=tot[i]; now+=sumv[i];}
  50. tAns+=(now-(ll)ma[x]*(ll)cnt);
  51. }
  52. int main()
  53. {
  54. scanf("%d%d",&n,&m); K=(m>>)+;
  55. for(int i=;i<=n;++i)
  56. {
  57. scanf("%d",&t[i].v);
  58. t[i].p=i;
  59. } sort(t+,t+n+);
  60. ma[a[t[].p]=++en]=t[].v;
  61. for(int i=;i<=n;++i)
  62. {
  63. if(t[i].v!=t[i-].v) ++en;
  64. ma[a[t[i].p]=en]=t[i].v;
  65. } makeblock();
  66. for(int i=;i<=m;++i) Insert(a[i]);
  67. int t=Query(K); Next_Sum(t); ans=min(ans,tAns);
  68. for(int i=m+;i<=n;++i)
  69. {
  70. Delete(a[i-m]); Insert(a[i]);
  71. int t=Query(K);
  72. Next_Sum(t);
  73. ans=min(ans,tAns);
  74. } printf("%lld\n",ans);
  75. return ;
  76. }

【枚举】【权值分块】bzoj1112 [POI2008]砖块Klo的更多相关文章

  1. [BZOJ1112][POI2008]砖块Klo

    [BZOJ1112][POI2008]砖块Klo 试题描述 N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另 ...

  2. [Bzoj1112][POI2008]砖块Klo(splay)

    1112: [POI2008]砖块Klo Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2353  Solved: 831[Submit][Statu ...

  3. 【主席树】bzoj1112: [POI2008]砖块Klo

    数据结构划一下水 Description N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另一柱.仓库无限大. ...

  4. [BZOJ1112] [POI2008] 砖块Klo (treap)

    Description N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另一柱.仓库无限大. 现在希望用最小次 ...

  5. BZOJ1112[POI2008]砖块Klo——非旋转treap

    题目描述 N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另一柱.仓库无限大. 现在希望用最小次数的动作完成任 ...

  6. 【BZOJ1112】[POI2008]砖块Klo Treap

    [BZOJ1112][POI2008]砖块Klo Description N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出 ...

  7. 1112: [POI2008]砖块Klo

    1112: [POI2008]砖块Klo Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1245  Solved: 426[Submit][Statu ...

  8. 【DFS序】【莫队算法】【权值分块】bzoj2809 [Apio2012]dispatching

    题意:在树中找到一个点i,并且找到这个点子树中的一些点组成一个集合,使得集合中的所有点的c之和不超过M,且Li*集合中元素个数和最大 首先,我们将树处理出dfs序,将子树询问转化成区间询问. 然后我们 ...

  9. BZOJ 1112: [POI2008]砖块Klo

    1112: [POI2008]砖块Klo Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1736  Solved: 606[Submit][Statu ...

随机推荐

  1. 怎么给word加底纹

  2. bzoj 3771 Triple FFT 生成函数+容斥

    Triple Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 847  Solved: 482[Submit][Status][Discuss] Desc ...

  3. linux 下查看网卡工作速率

    [root@hadoop058 ~]# mii-tool eth0: negotiated 100baseTx-FD, link ok 100M linux 下查看网卡工作速率 Ethtool是用于查 ...

  4. 使用 FirewallD 构建动态防火墙

    使用 FirewallD 构建动态防火墙 FirewallD 提供了支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具.它支持 IPv4, IPv6 防火墙设置以及以太网 ...

  5. css和javascript中图片路径的不同

    之前在写前端代码时,在图片路径的设置那里经常会遇到一个问题.比方说,我 (1)在根目录下面新建了个"images"文夹,里面放了张图片top.gif (2)在根目录下另外新建了两个 ...

  6. TestRedis

    import org.junit.Before; import org.junit.Test; import redis.clients.jedis.Jedis; import java.util.H ...

  7. .NET之特性和属性(转)

    1. 引言 attribute是.NET框架引入的有一技术亮点,因此我们有必要花点时间走进一个发现attribute登堂入室的入口.因为.NET Framework中使用了大量的定制特性来完成代码约定 ...

  8. 【poj3294-不小于k个字符串中最长公共子串】后缀数组

    1.注意每两个串之间的连接符要不一样. 2.分组的时候要注意最后一组啊!又漏了! 3.开数组要考虑连接符的数量.100010是不够的至少要101000. #include<cstdio> ...

  9. HDU4889 Scary Path Finding Algorithm

    Fackyyj loves the challenge phase in TwosigmaCrap(TC). One day, he meet a task asking him to find sh ...

  10. Sequence(ST表)(洛谷P2048)

    超级钢琴 知识储备 在做这道题前,我们先要了解一下ST表(一种离线求区间最值的方法) ST表使用DP实现的,其查询复杂度为O(1). 那么我们怎么用DP实现呢?? 首先,我们设立一个状态f[i][j] ...