题目背景

这是个非常经典的主席树入门题——静态区间第K小

数据已经过加强,请使用主席树。同时请注意常数优化

题目描述

如题,给定N个正整数构成的序列,将对于指定的闭区间查询其区间内的第K小值。

输入输出格式

输入格式:

第一行包含两个正整数N、M,分别表示序列的长度和查询的个数。

第二行包含N个正整数,表示这个序列各项的数字。

接下来M行每行包含三个整数l,r,k l, r, kl,r,k , 表示查询区间[l,r][l, r][l,r]内的第k小值。

输出格式:

输出包含k行,每行1个正整数,依次表示每一次查询的结果

输入输出样例

输入样例#1:

5 5
25957 6405 15770 26287 26465
2 2 1
3 4 1
4 5 1
1 2 2
4 4 1
输出样例#1:

6405
15770
26287
25957
26287

说明

数据范围

对于20%的数据满足:1≤N,M≤10

对于50%的数据满足:1≤N,M≤1033​​

对于80%的数据满足:1≤N,M≤1055​​

对于100%的数据满足:1≤N,M≤2⋅1055​​

对于数列中的所有数aii​​,均满足−109≤ai≤109-{10}^9 \leq a_i \leq {10}^9−10​9​​≤a​i​​≤10​9​​

样例数据说明

N=5,数列长度为5,数列从第一项开始依次为25957,6405,15770,26287,26465

第一次查询为[2,2]区间内的第一小值,即为6405

第二次查询为[3,4]区间内的第一小值,即为15770

第三次查询为[4,5]区间内的第一小值,即为26287

第四次查询为[1,2]]区间内的第二小值,即为25957

第五次查询为[4,4]区间内的第一小值,即为26287

主席树真奇妙

给出两位巨佬的链接

第一个很详细的解释了主席树

第二个给出了此题的所有做法

http://www.cnblogs.com/zyf0163/p/4749042.html

http://www.cnblogs.com/NaVi-Awson/p/7325571.html

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
struct Node
{
int key;
Node *ch[];
}S[N*],*pos=S;
Node *root[N+];
int a[N+],b[N+],n,m,sz,rem[N+];
void build(Node* &rt,int l,int r)
{
rt=++pos;
rt->key=;
if (l==r) return;
int mid=(l+r)/;
build(rt->ch[],l,mid);
build(rt->ch[],mid+,r);
}
void insert(Node* &rt,int l,int r,int k)
{
Node *x=rt;
rt=++pos;
rt->ch[]=x->ch[];
rt->ch[]=x->ch[];
rt->key=x->key+;
if (l==r) return;
int mid=(l+r)/;
if (k<=mid) insert(rt->ch[],l,mid,k);
else insert(rt->ch[],mid+,r,k);
}
int query(Node* rl,Node* rr,int l,int r,int k)
{
if (l==r) return l;
int mid=(l+r)/;
int x=rr->ch[]->key-rl->ch[]->key;
if (x>=k) return query(rl->ch[],rr->ch[],l,mid,k);
else return query(rl->ch[],rr->ch[],mid+,r,k-x);
}
int main()
{int i,j,x,y,k;
cin>>n>>m;
for (i=;i<=n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(b+,b+n+);
sz=unique(b+,b+n+)-(b+);
for (i=;i<=n;i++)
a[i]=lower_bound(b+,b+sz+,a[i])-b;
build(root[],,n);
for (i=;i<=n;i++)
{
root[i]=root[i-];
insert(root[i],,n,a[i]);
}
while (m--)
{
scanf("%d%d%d",&x,&y,&k);
int ans=query(root[x-],root[y],,n,k);
printf("%d\n",b[ans]);
}
}

[POJ 2104]K-th Number【模板】(主席树)的更多相关文章

  1. POJ 2104:K-th Number(主席树静态区间k大)

    题目大意:对于一个序列,每次询问区间[l,r]的第k大树. 分析: 主席树模板题 program kthtree; type point=record l,r,s:longint; end; var ...

  2. poj 2104 K-th Number(主席树,详细有用)

    poj 2104 K-th Number(主席树) 主席树就是持久化的线段树,添加的时候,每更新了一个节点的线段树都被保存下来了. 查询区间[L,R]操作的时候,只需要用第R棵树减去第L-1棵树就是区 ...

  3. POJ 2104 K-th Number(主席树模板题)

    http://poj.org/problem?id=2104 题意:求区间$[l,r]$的第k小. 思路:主席树不好理解啊,简单叙述一下吧. 主席树就是由多棵线段树组成的,对于数组$a[1,2...n ...

  4. 【POJ 2104】 K-th Number 主席树模板题

    达神主席树讲解传送门:http://blog.csdn.net/dad3zz/article/details/50638026 2016-02-23:真的是模板题诶,主席树模板水过.今天新校网不好,没 ...

  5. POJ 2104&HDU 2665 Kth number(主席树入门+离散化)

    K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 50247   Accepted: 17101 Ca ...

  6. POJ 2104 K-th Number(主席树——附讲解)

    Description You are working for Macrohard company in data structures department. After failing your ...

  7. poj 2104 K-th Number(主席树)

    Description You are working for Macrohard company in data structures department. After failing your ...

  8. poj 2104 K-th Number(主席树

    Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 59058   Accepted: 20529 Case Time Limi ...

  9. poj 2104: K-th Number 【主席树】

    题目链接 学习了一下主席树,感觉具体算法思路不大好讲.. 大概是先建个空线段树,然后类似于递推,每一个都在前一个“历史版本”的基础上建立一个新的“历史版本”,每个历史版本只需占用树高个空间(好神奇!) ...

  10. HDU 2665 Kth number(主席树静态区间第K大)题解

    题意:问你区间第k大是谁 思路:主席树就是可持久化线段树,他是由多个历史版本的权值线段树(不是普通线段树)组成的. 具体可以看q学姐的B站视频 代码: #include<cmath> #i ...

随机推荐

  1. Alpha冲刺No.4

    冲刺Day4 一.站立式会议 本来还想今天下午好好弄弄安卓开发,结果计划赶不上变化.(不存在的) 完成备忘录设计,个人界面设计 二.实际项目进展 搞了404(安卓和ssm的连接),好像还是不太行. 备 ...

  2. 201621123040《Java程序设计》第七周学习总结

    1.本周学习总结 1.1思维导图:Java图形界面总结 2.书面作业 2.1GUI中的事件处理 2.1.1写出事件处理模型中最重要的几个关键词. 关键词:事件 事件源 事件监听器 2.1.2任意编写事 ...

  3. Flask 扩展 国际化 本地化

    pip install flask-babel 先初始化一个Flask-Babel的实例 from flask import Flask from flask.ext.babel import Bab ...

  4. 每日冲刺报告-Day3

    敏捷冲刺每日报告--Day3 情况简介 今天的任务是把json处理函数加入到爬虫中,把搜索到的结果存到json文件里去. 任务进度 赵坤:在爬虫中加入了json处理的代码,解决了在控制台打印中文列表/ ...

  5. C语言——第四次作业

    题目 题目一:计算分段函数 1.实验代码 #include <stdio.h> int main() { double x,y; scanf("%lf",&x) ...

  6. CPP链表示例

    #include<iostream> #include<stdlib.h> using namespace std; typedef struct Student_data { ...

  7. System.Reflection名称空间下的程序集类Assembly应用.

    利用反射中的程序集类(Assembly--抽象类)动态加载类库(.dll)或者可执行程序(.exe). 优点:①.可以消除if条件的逻辑判断.②.减少内存资源.③.有利于程序扩展. 缺点... 使用静 ...

  8. linux的脚本应用for循环答应变量

    #!/bin/bash for var in A B C ; do echo "var is $var" done

  9. Excel+DDT数据驱动实例

    一.首先安装dtt模块 数据驱动原理 1.测试数据为多个字典的list类型 2.测试类前加修饰@ddt.ddt 3.case前加修饰@ddt.data() 4.运行后用例会自动加载成N个单独的用例 二 ...

  10. machine learning 之 logistic regression

    整理自Adrew Ng 的 machine learning课程week3 目录: 二分类问题 模型表示 decision boundary 损失函数 多分类问题 过拟合问题和正则化 什么是过拟合 如 ...