POJ 2104 K-th Number 静态主席树(裸

题目链接:点击打开链接

题意:

给定n长的序列,q个询问

下面n个数字给出序列

每个询问[l, r] k ,输出该区间中第k大的数

先建一个n个节点的空树,然后每次从后往前新建一棵树,依附原来的空树建。询问就是在树上二分。

#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <vector>
#include <iostream>
#include <cstring>
using namespace std;

const int N = 100010;
const int M = N * 30;
int n, q, tot;
int a[N];
int T[M], lson[M], rson[M], c[M];
vector<int>G;

void input(){
	G.clear();
	for (int i = 1; i <= n; i++)scanf("%d", &a[i]), G.push_back(a[i]);
	sort(G.begin(), G.end());
	G.erase(unique(G.begin(), G.end()), G.end());
	for (int i = 1; i <= n; i++)a[i] = lower_bound(G.begin(), G.end(), a[i]) - G.begin() + 1;
}
int build(int l, int r){
	int root = tot++;
	c[root] = 0;
	if (l != r){
		int mid = (l + r) >> 1;
		lson[root] = build(l, mid);
		rson[root] = build(mid + 1, r);
	}
	return root;
}
int updata(int root, int pos, int val){
	int newroot = tot++, tmp = newroot;
	c[newroot] = c[root] + val;
	int l = 1, r = G.size();
	while (l <= r){
		int mid = (l + r) >> 1;
		if (pos <= mid){
			lson[newroot] = tot++; rson[newroot] = rson[root];
			newroot = lson[newroot]; root = lson[root];
			r = mid - 1;
		}
		else {
			rson[newroot] = tot++; lson[newroot] = lson[root];
			newroot = rson[newroot]; root = rson[root];
			l = mid + 1;
		}
		c[newroot] = c[root] + val;
	}
	return tmp;
}
int query(int L, int R, int k){
	int l = 1, r = G.size(), ans = l;
	while (l <= r){
		int mid = (l + r) >> 1;
		if (c[lson[L]] - c[lson[R]] >= k){
			ans = mid;
			r = mid - 1;
			L = lson[L];
			R = lson[R];
		}
		else {
			l = mid + 1;
			k -= c[lson[L]] - c[lson[R]];
			L = rson[L];
			R = rson[R];
		}
	}
	return ans;
}
int main(){
	while (~scanf("%d%d", &n, &q)){
		input();
		tot = 0;
		T[n + 1] = build(1, G.size());
		for (int i = n; i; i--)
			T[i] = updata(T[i + 1], a[i], 1);
		while (q--){
			int l, r, k; scanf("%d %d %d", &l, &r, &k);
			printf("%d\n", G[query(T[l], T[r+1], k)- 1]);
		}
	}
	return 0;
}
时间: 2024-10-18 01:12:56

POJ 2104 K-th Number 静态主席树(裸的相关文章

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

题目大意:对于一个序列,每次询问区间[l,r]的第k大树. 分析: 主席树模板题 program kthtree; type point=record l,r,s:longint; end; var t:array[0..100000*50]of point; a,b,id,root:array[0..100000]of longint; n,i,m,x,y,k,v,len:longint; procedure qsort(l,h:longint); var i,j,t,m:longint; b

ZOJ 2112 Dynamic Rankings(主席树套树状数组+静态主席树)

题意:给定一个区间,求这个区间第k大的数,支持单点修改. 思路:主席树真是个神奇的东西.........速度很快但是也有一个问题就是占用内存的很大,一般来说支持单点修改的主席树套树状数组空间复杂度为O(n*logn*logn), 如果查询较少的话,可以初始的时候用一颗静态主席树,这样空间复杂度可以降为O(n*logn+q*logn*logn),勉强可以过zoj这道题. 这道题看了好久好久才懂...网上题解一般就几句话.......下面是自己的一些理解. 首先静态主席树这个东西其实比较好懂,就是对

静态主席树总结(静态区间的k大)

静态主席树总结(静态区间的k大) 首先我们先来看一道题 给定N个正整数构成的序列,将对于指定的闭区间查询其区间内的第K小值. 输入格式: 第一行包含两个正整数N.M,分别表示序列的长度和查询的个数. 第二行包含N个正整数,表示这个序列各项的数字. 接下来M行每行包含三个整数 l, r, kl,r,k , 表示查询区间[l, r][l,r] 内的第k小值. 输出格式: 输出包含k行,每行1个正整数,依次表示每一次查询的结果 对于100%的数据满足:\(1 \leq N, M \leq 2\cdot

COGS 930. [河南省队2012] 找第k小的数 主席树

主席树裸板子 #include<cstdio> #include<iostream> #include<algorithm> #define MAXN 100005 #define MAX 2000005 using namespace std; int sum[MAX],l[MAX],mid[MAX],r[MAX],a[MAXN],b[MAXN],n,m,sz,size,root[MAXN],cnt; void build(int &x,int z,int y

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

K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 50247   Accepted: 17101 Case Time Limit: 2000MS Description You are working for Macrohard company in data structures department. After failing your previous task about key inse

poj 2104 静态主席树

我的第一道主席树(静态). 先记下自己对主席树的理解: 主席树的作用是用于查询区间第k大的元素(初始化nlog(n),查询log(n)) 主席树=可持续线段树+前缀和思想 主席树实际上是n棵线段树(由于是可持续化线段树,所以实际上是n个长度为log(n)的链),第i棵线段树保存的是a[1]~a[i]这i个数的值域线段树,每个节点维护的是该值域中元素个数,这个是可以相减的,所以建完树后,查询[lf,rg]的第k大时,保存当前查询的值域区间在lf-1和rg这两棵线段树中的节点u,v(不理解看代码),

POJ 2104 K-th Number(主席树)

K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 57427   Accepted: 19856 Case Time Limit: 2000MS Description You are working for Macrohard company in data structures department. After failing your previous task about key inse

[HDU 2665&amp;POJ 2104]K-th Number(主席树)

Description Give you a sequence and ask you the kth big number of a inteval. Solution 主席树模板题 敲完辣,心情瞬间变好,我要下楼看运动会 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #define MAXN 100005

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

达神主席树讲解传送门:http://blog.csdn.net/dad3zz/article/details/50638026 2016-02-23:真的是模板题诶,主席树模板水过.今天新校网不好,没有评测,但我立下flag这个代码一定能A.我的同学在自习课上考语文,然而机房党都跑到机房来避难了\(^o^)/~ #include<cstdio> #include<cstring> #include<algorithm> #define for1(i,a,n) for(i