先说下权值线段树的概念吧

权值平均树 就是指区间维护值为这个区间内点出现次数和的线段树

用这个加权线段树 解决第k大问题就很方便了

int query(int l,int r,int rt,int k)//找第k大的数
{
if
(l==r) return l;
int
m=(l+r)/2;
if
(k<=sum[rt<<1]) return query(lson,k);//看左儿子的sum是否大于k大于的话 说明第k大的树在左儿子(利用出现的次数进行比对---建树的时候 边界是递增的)
else return
query(rson,k-sum[rt<<1]);
}
最后说一下使用权值线段树容易出现的问题 在建树的过程中 树的最大边界得包括我们需要的数据 那么问题来了 当数据很大的时候 不久爆内存了
这里得将数据离散化一下
什么是离散化呢 就是将数据映射成紧凑的数据 三个步骤
1.排序 2.去重 unqinue()函数。。 3.二分定位 用位置映射数据(lower_bound函数。。)

附上吴迎学长离散化的标准代码

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int a[100],b[100],c[100],n;
int solve()//离散化
{
for(int i=0;i<n;i++) b[i]=a[i];
sort(b,b+n);
int m=unique(b,b+n)-b;//去重
for(int i=0;i<n;i++) c[i]=lower_bound(b,b+m,a[i])-b;//二分找对应位置
for(int i=0;i<n;i++) printf("%d ",c[i]);
}
int main()
{ freopen("in.txt","r",stdin);
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
solve();
return 0;
}

再说说5249吧。,。 看了下吴迎学长的代码。。 感触挺深。 自己按照思路码了一遍 库函数好用

#include<cstdio>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<queue>
#define lson l,m,rt<<1 //显得代码比较精简
#define rson m+1,r,rt<<1|1
#define maxn 10005
using namespace std;
int
sum[maxn<<];
int
n,a[maxn],b[maxn],c[maxn];
void
Pushup(int rt)
{

sum[rt]=sum[rt<<]+sum[rt<<|];
}

void
build(int l,int r,int rt)
{

if
(l==r)
{

sum[rt]=;
return
;
}

int
m=(l+r)/;
build(lson);
build(rson);
Pushup(rt);
}

void
updata(int l,int r,int rt,int temp,int flag)
{

if
(l==r)
{

sum[rt]+=flag;
return
;
}

int
m=(l+r)/;
if
(temp<=m) updata(lson,temp,flag);//
else updata(rson,temp,flag);
Pushup(rt);
}

int
query(int l,int r,int rt,int k)//找第k大的数
{
if
(l==r) return l;
int
m=(l+r)/;
if
(k<=sum[rt<<]) return query(lson,k);
else return
query(rson,k-sum[rt<<]);
}

int
main()
{

int
t=;
while
(~scanf("%d",&n))//由于需要离散化的过程 我们需要离线写
{
char
op[];
queue<int> que;
// freopen("in.txt","r",stdin);
for(int i=;i<=n;i++)
{

scanf("%s",op);
if
(op[]=='i') scanf("%d",&a[i]);
else if
(op[]=='o') a[i]=-;
else
a[i]=-;
}

int
m=;
for
(int i=;i<=n;i++)
{

if
(a[i]>=) b[m]=a[i],c[m++]=a[i];
}

sort(c+,c+m);
int
mm=unique(c+,c+m)-(c+);//离散的排序 去重 unique函数的参数为需要去重的范围 返回值为最后一个去重过程的函数 还有就是这个函数只对相邻的数去重
build(,mm,);
printf("Case #%d:\n",++t);
// cout<<mm<<endl;
// for(int i=1;i<=mm;i++) cout<<c[i]<<endl;
for(int i=;i<=n;i++)
{

if
(a[i]>=)
{

int
temp=lower_bound(c+,c+mm+,a[i])-c;//离散坐标对应
updata(,mm,,temp,);
// cout<<temp<<endl;
// for(int i=1;i<=7;i++) cout<<"in"<<sum[i]<<endl;
que.push(a[i]);
}

else if
(a[i]==-)
{

int
ret=que.front();
int
temp=lower_bound(c+,c+mm+,ret)-c;// 在c数组中找到第一个不小于ret的数
updata(,mm,,temp,-);
//for(int i=1;i<=7;i++) cout<<' '<<"out"<<sum[i]<<endl;
que.pop();
}

else

{

// cout<<que.size()/2+1<<endl;
printf("%d\n",c[query(,mm,,(que.size()/+))]);
}
}
}

return
;
}

区间第k大问题 权值线段树 hdu 5249的更多相关文章

  1. HDU 6464 权值线段树 && HDU 6468 思维题

    免费送气球 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  2. BZOJ 3110 ZJOI 2013 K大数查询 树套树(权值线段树套区间线段树)

    题目大意:有一些位置.这些位置上能够放若干个数字. 如今有两种操作. 1.在区间l到r上加入一个数字x 2.求出l到r上的第k大的数字是什么 思路:这样的题一看就是树套树,关键是怎么套,怎么写.(话说 ...

  3. 动态求区间K大值(权值线段树)

    我们知道我们可以通过主席树来维护静态区间第K大值.我们又知道主席树满足可加性,所以我们可以用树状数组来维护主席树,树状数组的每一个节点都可以开一颗主席树,然后一起做. 我们注意到树状数组的每一棵树都和 ...

  4. 【bzoj3110】[Zjoi2013]K大数查询 权值线段树套区间线段树

    题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数 ...

  5. 【bzoj3065】带插入区间K小值 替罪羊树套权值线段树

    题目描述 从前有n只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力a[i].跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理性愉悦一下,查询区间k小值.他每次向它的随从伏特提出 ...

  6. 【BZOJ3065】带插入区间K小值 替罪羊树+权值线段树

    [BZOJ3065]带插入区间K小值 Description 从前有n只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力a[i].跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理 ...

  7. 3065: 带插入区间K小值_树套树_替罪羊树_权值线段树

    经过周六一天,周一3个小时的晚自习,周二2个小时的疯狂debug,终于凭借自己切掉了这道树套树题. Code: #include <cstdio> #include <algorit ...

  8. BZOJ3110[Zjoi2013]K大数查询——权值线段树套线段树

    题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是 ...

  9. HDU6621 K-th Closest Distance 第 k 小绝对值(主席树(统计范围的数有多少个)+ 二分 || 权值线段树+二分)

    题意:给一个数组,每次给 l ,r, p, k,问区间 [l, r] 的数与 p 作差的绝对值的第 k 小,这个绝对值是多少 分析:首先我们先分析单次查询怎么做: 题目给出的数据与多次查询已经在提示着 ...

随机推荐

  1. GIS 空间分析案例教程-坐标高斯投影正反算

    GIS 空间分析案例教程-坐标高斯投影正反算 商务科技合作:向日葵,135-4855__4328,xiexiaokui#qq.com 特点: 1. 地理处理工具,可以与任何arcgis 工具和语言集成 ...

  2. 基于Android的ADT目录

    src: 源代码(重要) gen : 工具自动生成的代码 > BUildconfig 调试的开关,默认开启 > R.java 很多的静态的内部类 > 开发用的jar包 Android ...

  3. gevent学习

    gevent gevent基于协程的网络库,基于libev的快速的事件循环,基于greenlet的轻量级执行单元,重用了Python标准库中的概念,支持socket.ssl.三方库通过打猴子补丁的形式 ...

  4. 怎么用群晖webdav实现外网映射网络驱动器

    前几天刚作好群晖nas局域网内的磁盘映射功能,今天老板又想实现在家里也能跟在公司一样的方便访问映射功能,因为使用网页操作实在太麻烦了.这可怎么办官方提供的 Assistant工具只能操作局域网的,又没 ...

  5. npm教程、脚手架

    使用之前,我们先来掌握3个东西是用来干什么的. npm: Nodejs下的包管理器. webpack: 它主要的用途是通过CommonJS的语法把所有浏览器端需要发布的静态资源做相应的准备,比如资源的 ...

  6. CentOS7下搭建zabbix监控(二)——Zabbix被监控端配置

    Zabbix监控端配置请查看:CentOS7下搭建zabbix监控(一)——Zabbix监控端配置 (1).在CentOS7(被监控端)上部署Zabbix Agent 主机名:youxi2 IP地址: ...

  7. ubuntu18.04 server配置静态ip,新的网络工具netplan的使用方法【转:http://forum.ubuntu.org.cn/viewtopic.php?t=487463】

    最新发布的ubuntu18.04 server,启用了新的网络工具netplan,对于命令行配置网络参数跟之前的版本有比较大的差别,现在介绍如下:1.其网络配置文件是放在/etc/netplan/50 ...

  8. Egret入门学习日记 --- 第十九篇(书中 8.8~8.10 节 内容)

    第十九篇(书中 8.8~8.10 节 内容) 开始 8.8节. 重点: 1.类型推断. 2.类型强制转换,使其拥有代码提示功能. 3.除了TS自带的类型判断,Egret官方也提供了类型判断的方法. 操 ...

  9. vue input 循环渲染问题

    <li> <span>下属区县:</span> <div class="quxianList" v-for="(qx,index ...

  10. Jenkins简单入门:下载-安装-配置-构建

    Jenkins简单配置流程 官网下载地址:https://jenkins.io/index.html 1.下载安装Jenkins (1)点击Download Jenkins进入下载页 (2)根据自己运 ...