权值线段树板子题

https://www.luogu.org/problem/P1168

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int tree[maxn*4];
int dtc[maxn];
int a[maxn];
void pushup(int root)
{
    tree[root]=tree[root<<1]+tree[root<<1|1];
}
void update(int root,int l,int r,int index) // 将权值线段树上值为index(已离散化)的位置值+1
{
    if(l==r)
    {
        tree[root]++;
        return;
    }
    int mid=(l+r)/2;
    if(mid>=index)
        update(root<<1,l,mid,index);
    else
        update(root<<1|1,mid+1,r,index);
    pushup(root);
}
int querry(int root,int l,int r,int k) // 查询第k大的数字
{
    if(l==r)
        return l;
    int mid=(l+r)/2;
    if(tree[root<<1]>=k)
        return querry(root<<1,l,mid,k);
    return querry(root<<1|1,mid+1,r,k-tree[root<<1]);
}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i = 1; i <= n; ++i)
    {
        scanf("%d",&a[i]);
        dtc[i]=a[i];
    }
    sort(a+1,a+1+n);
    int cnt=unique(a+1,a+1+n)-a-1;
    for(int i = 1; i <= n; ++i)
        dtc[i]=lower_bound(a+1,a+1+cnt,dtc[i])-a;
    for(int i = 1; i <= n; ++i)
    {
        update(1,1,n,dtc[i]);
        if(i&1)
        {
            int ans=querry(1,1,n,(i+1)/2);
            printf("%d\n",a[ans]);
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/dongdong25800/p/11605007.html

时间: 2024-10-12 02:20:13

权值线段树板子题的相关文章

权值线段树模板题

array Time Limit: 1500ms Memory Limit: 256M Description You are given an array . Initially, each element of the array is unique.Moreover, there are  instructions. Each instruction is in one of the following two formats: 1. ,indicating to change the v

[bzoj3932][CQOI2015]任务查询系统-题解[主席树][权值线段树]

Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第Ei秒后结束(第Si秒和Ei秒任务也在运行 ),其优先级为Pi.同一时间可能有多个任务同时执行,它们的优先级可能相同,也可能不同.调度系统会经常向 查询系统询问,第Xi秒正在运行的任务中,优先级最小的Ki个任务(即将任务按照优先级从小到大排序后取前Ki个 )的优先级之和是多少.特别的,如

【BZOJ4605】崂山白花蛇草水 权值线段树+kd-tree

[BZOJ4605]崂山白花蛇草水 Description 神犇Aleph在SDOI Round2前立了一个flag:如果进了省队,就现场直播喝崂山白花蛇草水.凭借着神犇Aleph的实力,他轻松地进了山东省省队,现在便是他履行诺言的时候了.蒟蒻Bob特地为他准备了999,999,999,999,999,999瓶崂山白花蛇草水,想要灌神犇Aleph.神犇Aleph求(跪着的)蒟蒻Bob不要灌他,由于神犇Aleph是神犇,蒟蒻Bob最终答应了他的请求,但蒟蒻Bob决定将计就计,也让神犇Aleph回答

【bzoj4605】崂山白花蛇草水 权值线段树套KD-tree

题目描述 神犇Aleph在SDOI Round2前立了一个flag:如果进了省队,就现场直播喝崂山白花蛇草水.凭借着神犇Aleph的实力,他轻松地进了山东省省队,现在便是他履行诺言的时候了.蒟蒻Bob特地为他准备了999,999,999,999,999,999瓶崂山白花蛇草水,想要灌神犇Aleph.神犇Aleph求(跪着的)蒟蒻Bob不要灌他,由于神犇Aleph是神犇,蒟蒻Bob最终答应了他的请求,但蒟蒻Bob决定将计就计,也让神犇Aleph回答一些问题.具体说来,蒟蒻Bob会在一个宽敞的广场上

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

题目大意:有一些位置,这些位置上可以放若干个数字.现在有两种操作. 1.在区间l到r上添加一个数字x 2.求出l到r上的第k大的数字是什么 思路:这种题一看就是树套树,关键是怎么套,怎么写.(话说我也不会来着..)最容易想到的方法就是区间线段树套一个权值线段树,但是区间线段树上的标记就会变得异常复杂.所以我们就反过来套,用权值线段树套区间线段树.这样修改操作在外线段树上就变成了单点修改,外线段树就不用维护标记了.在里面的区间线段树上维护标记就容易多了.具体实现见代码. CODE: #includ

B20J_2733_[HNOI2012]永无乡_权值线段树合并

Description:n座岛,编号从1到n,每座岛都有自己的独一无二的重要度,按照重要度可以将这n座岛排名,名次用1到 n来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛到达另一个岛.现在有两种操作:B x y表示在岛 x与岛y之间修建一座新桥.Q x k表示询问当前与岛 x连通的所有岛中第k重要的是哪座岛,即所有与岛 x连通的岛中重要度排名第 k小的岛是哪座,请你输出那个岛的编号. 对于100%的数据n≤100000,m≤n,q≤300000. 分析:读懂题后发现是一道线段树合并的裸题.

Codeforces 666E Forensic Examination SAM+权值线段树

第一次做这种$SAM$带权值线段树合并的题 然而$zjq$神犇看完题一顿狂码就做出来了 $Orz$ 首先把所有串当成一个串建$SAM$ 我们对$SAM$上每个点 建一棵权值线段树 每个叶子节点表示一个匹配串能到达这个点的子串个数 这样我们对最后的$SAM$的权值线段树按$parent$树合并 询问的时候找到对应的$SAM$上的权值线段树直接查询就好了 具体的操作看代码吧~ #include<bits/stdc++.h> using namespace std; #define FO(x) {f

【权值线段树】离散化介绍 (+利用 线段树 求逆序对)

先介绍一下离散化 桶排大家应该知道,就是开一个数组(下标为数值,记录了该数值的出现次数)然后遍历过去如果出现次数不为零,那就输出这些数字,理论时间复杂度可以达到O(N)但是由于内存限制,不能开很大的数组. 然而 如果某个数列中的数字不要求大小确定,只要求这些数字有相对的大小就够了的话,离散化就有了用武之地 举个例子:数列 3 8 7 5 2000000000000000 我们发现有几个数之间差距很大,但是我们用不到数值的大小,只要求相对大小,那怎么办呢? 观察下面的数列: 1 4 3 2 5 真

权值线段树2

今天给大家带来的是求逆序对个数. 我会归并! 当然,还是用权值线段树解决 题目链接:逆序对1或逆序对2 都是板子,一摸一样,双倍积分 首先,逆序对是什么? 对于给定的一段正整数序列,逆序对就是序列中ai>aj且i< j的有序对 通俗来讲,就是有一列数,如果有这样两个数m,n满足 m在n前面 m比n大 那么m,n就是一对逆序对,现在我们要求的就是这种逆序对个数. 我们能够想到这样一种方法: 读入一个数,查找之前读入的数中比它大的数的个数,累加答案 把它丢进某种数据结构中 而这"某种数据