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

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

用这个加权线段树 解决第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. JMeter_控制器执行效果_给自己挖过的坑

    线程及循环设置: 数据文件中放在“循环控制器”中的执行效果:每条数据执行5次,取够50条数据时停止 简单逻辑控制器按下面的目录创建后,执行结果效果同上面循环控制器的执行效果 本来想规整下目录结构,结果 ...

  2. 使用ConstraintLayout(约束布局)构建响应式UI

    使用ConstraintLayout(约束布局)构建响应式UI 转 https://www.300168.com/yidong/show-2740.html     核心提示:ConstraintLa ...

  3. [Java复习] 分布式事务 Part 1

    1. CAP理论 C: Consistency 一致性 A: Availability 可用性 P: Partition tolerance 分区容错性 CAP定理:一个分布式系统不可能同时满足CAP ...

  4. [MongoDB教程] 2.MongoDB的安装与使用

    下载mongodb的版本,两点注意 根据业界规则,偶数为稳定版,如3.2.X:奇数为开发版,如3.3.X 32bit的mongodb最大只能存放2G的数据,64bit就没有限制 MongoDB官网安装 ...

  5. matlab学习——05插值和拟合(一维二维插值,拟合)

    05插值和拟合 1.一维插值 (1) 机床加工零件,试用分段线性和三次样条两种插值方法计算.并求x=0处的曲线斜率和13<=x<=15范围内y的最小值. x0=[0 3 5 7 9 11 ...

  6. LeetCode_141. Linked List Cycle

    141. Linked List Cycle Easy Given a linked list, determine if it has a cycle in it. To represent a c ...

  7. 【Leetcode_easy】696. Count Binary Substrings

    problem 696. Count Binary Substrings 题意:具有相同个数的1和0的连续子串的数目: solution1:还不是特别理解... 遍历元数组,如果是第一个数字,那么对应 ...

  8. 机器学习笔记——k-近邻算法(一)(摘抄于《机器学习实战》)

    k-近邻算法 k-近邻算法(kNN),它的工作原理是:存在一个样本数 据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据 与所属分类的对应关系.输入没有标签的新数据后 ...

  9. Spark学习笔记0——简单了解和技术架构

    目录 Spark学习笔记0--简单了解和技术架构 什么是Spark 技术架构和软件栈 Spark Core Spark SQL Spark Streaming MLlib GraphX 集群管理器 受 ...

  10. 【转载】49个CSS知识点

    01.[负边距]