为啥我一考虑重复元素就会输出0?
查看原帖
为啥我一考虑重复元素就会输出0?
81832
Starry___sky楼主2020/9/14 22:34
#include<bits/stdc++.h>

using namespace std;

const int N = 2e5 + 100;
const int INF = 0x7ffffffc;

struct node{
	int size, key, pri, ls, rs, cnt;//分别为:子树大小,值,优先级, 左儿子,右儿子,重复元素个数 
	#define s(k) t[k].size
	#define v(k) t[k].key
	#define p(k) t[k].pri
	#define ls(k) t[k].ls
	#define rs(k) t[k].rs
	#define c(k) t[k].cnt
}t[N];
int pool = 0, rt = 0;

int a[N], u[N];

int n, m;

void upt(int &k){s(k) = s(ls(k)) + s(rs(k)) + 1;}

void zig(int &k)
{
	int y = ls(k);
	ls(k) = rs(y);
	rs(y) = k;
	s(y) = s(y);
	upt(k);
	k = y;
}

void zag(int &k)
{
	int y = rs(k);
	rs(k) = ls(y);
	ls(y) = k;
	s(y) = s(k);
	upt(k);
	k = y;
}

void insert(int &k, const int &key)
{
	if(!k)
	{
		k = ++pool;
		v(k) = key;
		s(k) = 1;
		p(k) = rand();
		c(k) = 1;
		ls(k) = rs(k) = 0;
		return;
	}
	else
		++s(k);
	if(v(k) == key)//这里
	{
		++c(k);
		return;
	}
	else if(v(k) < key)
	{
		insert(rs(k), key);
		if(p(rs(k)) < p(k))
			zag(k);
	}
	else
	{
		insert(ls(k), key);
		if(p(ls(k)) < p(k))
			zig(k);
	}
}

int query_th(int k)
{
	int x = rt;
	while(x)
	{
		if(k > s(ls(k)) && k <= s(ls(k)) + c(k))//这里
			return v(x);
		if(k <= s(ls(x)))
			x = ls(x);
		else{
			k -= s(ls(x)) + c(k);
			x = rs(x);
		}
	}
	return 0;
}

int main()
{
	cin >> m >> n;
	srand(time(0));
	for(int i = 1; i <= m; i++)
		cin >> a[i];
	for(int i = 1; i <= n; i++)
		cin >> u[i];
	insert(rt, INF);
	insert(rt, -INF);
	int k = 1;
	int j = 0;
	for(int i = 1; i <= m; i++)
	{
		insert(rt, a[i]);
		//cout << a[i] << ' ';
		while(i == u[k])
		{
			cout << query_th(++j + 1) << endl;
			k++;
		}
	}
	return 0;
}
2020/9/14 22:34
加载中...