思路:

权值线段树 (找中位数用的) 记录下出现的次数和sum

一定要注意 有可能中位数的值有许多数 这怎么办呢 (离散化以后不去重就行了嘛…….)

(为什么他们想得那么麻烦)

  1. //By SiriusRen
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6. #define N 100500
  7. #define int long long
  8. int n,k,sum[N*10],tree[N*10],xx,ans=100000LL*1000000LL;
  9. struct Node{
  10. int num,pos;
  11. friend bool operator < (Node a,Node b){
  12. if(a.num!=b.num)return a.num<b.num;
  13. return a.pos<b.pos;
  14. }
  15. }node[N],cpy[N];
  16. void insert(int l,int r,int pos,int wei,int num){
  17. if(l==r){
  18. tree[pos]+=wei;
  19. if(tree[pos])sum[pos]=cpy[l].num;
  20. else sum[pos]=0;
  21. return;
  22. }
  23. int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
  24. if(mid>=num)insert(l,mid,lson,wei,num);
  25. else insert(mid+1,r,rson,wei,num);
  26. tree[pos]=tree[lson]+tree[rson];
  27. sum[pos]=sum[lson]+sum[rson];
  28. }
  29. void query(int l,int r,int pos,int num){
  30. if(l==r){xx=l;return;}
  31. int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
  32. if(tree[lson]>=num)query(l,mid,lson,num);
  33. else query(mid+1,r,rson,num-tree[lson]);
  34. }
  35. int query_sum(int l,int r,int pos,int L,int R){
  36. if(l>=L&&r<=R)return sum[pos];
  37. int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
  38. if(mid<L)return query_sum(mid+1,r,rson,L,R);
  39. else if(mid>=R)return query_sum(l,mid,lson,L,R);
  40. else return query_sum(l,mid,lson,L,R)+query_sum(mid+1,r,rson,L,R);
  41. }
  42. signed main(){
  43. scanf("%lld%lld",&n,&k);
  44. for(int i=1;i<=n;i++)
  45. scanf("%lld",&node[i].num),node[i].pos=i,cpy[i]=node[i];
  46. sort(cpy+1,cpy+1+n);
  47. for(int i=1;i<k;i++)
  48. insert(1,n,1,1,lower_bound(cpy+1,cpy+1+n,node[i])-cpy);
  49. for(int i=k;i<=n;i++){
  50. int temp=0;
  51. insert(1,n,1,1,lower_bound(cpy+1,cpy+1+n,node[i])-cpy);
  52. query(1,n,1,k/2+1);
  53. temp=cpy[xx].num*(k/2+1)-query_sum(1,n,1,1,xx);
  54. temp+=query_sum(1,n,1,xx+1,n)-cpy[xx].num*(k-(k/2+1));
  55. ans=min(ans,temp);
  56. insert(1,n,1,-1,lower_bound(cpy+1,cpy+1+n,node[i-k+1])-cpy);
  57. }
  58. printf("%lld\n",ans);
  59. }

BZOJ 1112 线段树的更多相关文章

  1. BZOJ 1798 (线段树||分块)的标记合并

    我原来准备做方差的.. 结果发现不会维护两个标记.. 就是操作变成一个 a*x+b ,每次维护a , b 即可 加的时候a=1 ,b=v 乘的时候a=v ,b=0 #include <cstdi ...

  2. bzoj 3999 线段树区间提取 有序链剖

    看错题目了,想成每个城市都可以买一个东西,然后在后面的某个城市卖掉,问最大收益.这个可以类似维护上升序列的方法在O(nlog^3n)的时间复杂度内搞定 这道题用到的一些方法: 1. 可以将有关的线段提 ...

  3. bzoj 3211 线段树

    开方操作最多进行5次就可以把出现的任何数变成1. 所以用线段树暴力修改,以后修改时只需看一下是否当前区间都是0或1,如果是那么就直接返回. /***************************** ...

  4. bzoj 1018 线段树维护连通性

    本题将一道LCT的题特殊化(支持加边和删边,询问图的连通性),将图变成了2×m的网格图,然后就神奇地可以用线段树来维护. 对于每个区间[l,r],维护其四个角落之间的连通性(仅仅通过[l,r]这段的边 ...

  5. bzoj 3212 线段树

    裸的线段树 /************************************************************** Problem: User: BLADEVIL Langua ...

  6. bzoj 2120 线段树套平衡树

    先吐下槽,改了快一个小时,最后发现是SBT的delete写错了,顿时就有想死的心..... 首先对于这道题,我们应该先做一下他的小问题,bzoj1878,虽然和这道题几乎一点关系没有, 但是能给我们一 ...

  7. bzoj 1901 线段树套平衡树+二分答案查询

    我们就建一颗线段树,线段树的每一个节点都是一颗平衡树,对于每个询问来说,我们就二分答案, 查询每个二分到的mid在这个区间里的rank,然后就行了 /************************* ...

  8. BZOJ 1012 线段树||单调队列

    非常裸的线段树  || 单调队列: 假设一个节点在队列中既没有时间优势(早点入队)也没有值优势(值更大),那么显然不管在如何的情况下都不会被选为最大值. 既然它仅仅在末尾选.那么自然能够满足以上的条件 ...

  9. BZOJ 3681 线段树合并+网络流

    思路: 暴力建图有n*m条边 考虑怎么优化 (那就只能加个线段树了呗) 然后我就不会写了..... 抄了一波题解 //By SiriusRen #include <bits/stdc++.h&g ...

随机推荐

  1. BZOJ 3325 [SCOI2013]密码 (逆模拟Manacher+构造)

    题目大意:给你一个字符串每个位置和相邻两个位置为回文中心的最长回文串长度,让你构造一个合法的字典序最小的字符串 挺有意思的构造题 首先按照$Manacher$的思想还原$p$数组 定义$f_{ij}$ ...

  2. 链表(list)--c实现

    做c的开发有1年多了,期间写过c++,感觉基础不够好,补上去,不丢人.o(^▽^)o to better myself. #include <stdio.h> #include <s ...

  3. state.sls web.apache

    [root@master01 web]# salt 'node02' state.sls web.apache node02: ----------           ID: apache-inst ...

  4. Centos6.6 系统优化

    1:最小化安装 2:修改网卡 vim /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0HWADDR=52:54:00:0e:c2:c3TYPE ...

  5. Java基础学习总结(44)——10个Java 8 Lambda表达式经典示例

    Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表达式,它将允许我们将行为传到函数里.在Ja ...

  6. 洛谷 P2049 魔术棋子

    P2049 魔术棋子 题目描述 在一个M*N的魔术棋盘中,每个格子中均有一个整数,当棋子走进这个格子中,则此棋子上的数会被乘以此格子中的数.一个棋子从左上角走到右下角,只能向右或向下行动,请问此棋子走 ...

  7. HTML5 界面元素 Canvas 參考手冊

    HTML5 界面元素 Canvas 參考手冊 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协 ...

  8. Cannot find the class file for javax.servlet.ServletContext.

    当eclipse中新导入的Java Project的时候.往往会碰到各种各样的问题,以下是个典型的问题: Cannot find the class file for javax.servlet.Se ...

  9. 【剑指Offer面试题】 九度OJ1516:调整数组顺序使奇数位于偶数前面

    题目链接地址: http://ac.jobdu.com/problem.php?pid=1516 题目1516:调整数组顺序使奇数位于偶数前面 时间限制:1 秒内存限制:128 兆特殊判题:否提交:2 ...

  10. spark pipeline 例子

    """ Pipeline Example. """ # $example on$ from pyspark.ml import Pipeli ...