BZOJ 1112 线段树
思路: 
权值线段树 (找中位数用的) 记录下出现的次数和sum
一定要注意  有可能中位数的值有许多数   这怎么办呢   (离散化以后不去重就行了嘛…….) 
(为什么他们想得那么麻烦)
//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 100500
#define int long long
int n,k,sum[N*10],tree[N*10],xx,ans=100000LL*1000000LL;
struct Node{
    int num,pos;
    friend bool operator < (Node a,Node b){
        if(a.num!=b.num)return a.num<b.num;
        return a.pos<b.pos;
    }
}node[N],cpy[N];
void insert(int l,int r,int pos,int wei,int num){
    if(l==r){
        tree[pos]+=wei;
        if(tree[pos])sum[pos]=cpy[l].num;
        else sum[pos]=0;
        return;
    }
    int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
    if(mid>=num)insert(l,mid,lson,wei,num);
    else insert(mid+1,r,rson,wei,num);
    tree[pos]=tree[lson]+tree[rson];
    sum[pos]=sum[lson]+sum[rson];
}
void query(int l,int r,int pos,int num){
    if(l==r){xx=l;return;}
    int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
    if(tree[lson]>=num)query(l,mid,lson,num);
    else query(mid+1,r,rson,num-tree[lson]);
}
int query_sum(int l,int r,int pos,int L,int R){
    if(l>=L&&r<=R)return sum[pos];
    int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
    if(mid<L)return query_sum(mid+1,r,rson,L,R);
    else if(mid>=R)return query_sum(l,mid,lson,L,R);
    else return query_sum(l,mid,lson,L,R)+query_sum(mid+1,r,rson,L,R);
}
signed main(){
    scanf("%lld%lld",&n,&k);
    for(int i=1;i<=n;i++)
        scanf("%lld",&node[i].num),node[i].pos=i,cpy[i]=node[i];
    sort(cpy+1,cpy+1+n);
    for(int i=1;i<k;i++)
        insert(1,n,1,1,lower_bound(cpy+1,cpy+1+n,node[i])-cpy);
    for(int i=k;i<=n;i++){
        int temp=0;
        insert(1,n,1,1,lower_bound(cpy+1,cpy+1+n,node[i])-cpy);
        query(1,n,1,k/2+1);
        temp=cpy[xx].num*(k/2+1)-query_sum(1,n,1,1,xx);
        temp+=query_sum(1,n,1,xx+1,n)-cpy[xx].num*(k-(k/2+1));
        ans=min(ans,temp);
        insert(1,n,1,-1,lower_bound(cpy+1,cpy+1+n,node[i-k+1])-cpy);
    }
    printf("%lld\n",ans);
}
BZOJ 1112 线段树的更多相关文章
- BZOJ 1798 (线段树||分块)的标记合并
		
我原来准备做方差的.. 结果发现不会维护两个标记.. 就是操作变成一个 a*x+b ,每次维护a , b 即可 加的时候a=1 ,b=v 乘的时候a=v ,b=0 #include <cstdi ...
 - bzoj 3999 线段树区间提取 有序链剖
		
看错题目了,想成每个城市都可以买一个东西,然后在后面的某个城市卖掉,问最大收益.这个可以类似维护上升序列的方法在O(nlog^3n)的时间复杂度内搞定 这道题用到的一些方法: 1. 可以将有关的线段提 ...
 - bzoj 3211 线段树
		
开方操作最多进行5次就可以把出现的任何数变成1. 所以用线段树暴力修改,以后修改时只需看一下是否当前区间都是0或1,如果是那么就直接返回. /***************************** ...
 - bzoj 1018 线段树维护连通性
		
本题将一道LCT的题特殊化(支持加边和删边,询问图的连通性),将图变成了2×m的网格图,然后就神奇地可以用线段树来维护. 对于每个区间[l,r],维护其四个角落之间的连通性(仅仅通过[l,r]这段的边 ...
 - bzoj 3212 线段树
		
裸的线段树 /************************************************************** Problem: User: BLADEVIL Langua ...
 - bzoj 2120 线段树套平衡树
		
先吐下槽,改了快一个小时,最后发现是SBT的delete写错了,顿时就有想死的心..... 首先对于这道题,我们应该先做一下他的小问题,bzoj1878,虽然和这道题几乎一点关系没有, 但是能给我们一 ...
 - bzoj 1901 线段树套平衡树+二分答案查询
		
我们就建一颗线段树,线段树的每一个节点都是一颗平衡树,对于每个询问来说,我们就二分答案, 查询每个二分到的mid在这个区间里的rank,然后就行了 /************************* ...
 - BZOJ 1012  线段树||单调队列
		
非常裸的线段树 || 单调队列: 假设一个节点在队列中既没有时间优势(早点入队)也没有值优势(值更大),那么显然不管在如何的情况下都不会被选为最大值. 既然它仅仅在末尾选.那么自然能够满足以上的条件 ...
 - BZOJ  3681 线段树合并+网络流
		
思路: 暴力建图有n*m条边 考虑怎么优化 (那就只能加个线段树了呗) 然后我就不会写了..... 抄了一波题解 //By SiriusRen #include <bits/stdc++.h&g ...
 
随机推荐
- mysql 定时每秒插入一条数据
			
1.创建表 2.创建存储过程 CREATE PROCEDURE user()INSERT INTO user(name,sex) VALUES ('1111','1'); 3.创建定时器 CREATE ...
 - win10 64位下VirtualBox安装CentOS6.9
			
第一步:安装VritualBox 百度“VritualBox”下载安装即可: 第二步:下载Linux镜像系统并安装 这里写出我参照的博客,很详细,我就不累赘了! 原文地址:http://blog.cs ...
 - Qt之QThread
			
简述 QThread类提供了与系统无关的线程. QThread代表在程序中一个单独的线程控制.线程在run()中开始执行,默认情况下,run()通过调用exec()启动事件循环并在线程里运行一个Qt的 ...
 - 怎样在windows7上使用snmp命令
			
原文地址:http://wenboxz.com/archives/window7-use-snmp-command.html/
 - 在独立的文件里定义WPF资源
			
一.文章概述 本演示介绍怎样在单独的文件里定义WPF资源.并在须要的地方调用相关资源文件. 相关下载(代码.屏幕录像):http://pan.baidu.com/s/1sjO7StB 在线播放:htt ...
 - MySQL具体解释(9)----------索引具体解释
			
写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点. 考虑例如以下情况.假设数据库中一个表有10^6条记录,DBMS的页面大小为4K.并存储100条记录.假设没有索引, ...
 - 【递推DP】POJ1163The Triangle
			
题目链接:http://poj.org/problem?id=1163 事实上这个题目有非常多解法,可是我们能够看下这个用一位数组的高效动规解法,这个我上课时老师讲的,非常不错. 先保存最后一行4 5 ...
 - android   自己定义标签的使用,实现扁平化UI设计
			
2014年8月6日11:06:44 android对自己定义标签的使用.实现扁平化UI设计: 1.attrs.xml文件里自己定义标签 如: <?xml version="1.0&qu ...
 - 《鸟哥的Linux私房菜-基础学习篇(第三版)》(三)
			
第2章 Linxu怎样学习 1. Linux当前的应用角色 当前的Linux常见的应用可略分为企业应用和个人应用双方面. 首先谈了企业环境的利用. 1)网络server. 2)关键任务 ...
 - taglist安装
			
注意:taglist依赖于ctags,所以要先装ctags,否则taglist装了也没法用!1.首先安装ctags1)ubuntu安装sudo apt-get install exuberant-ct ...