#11TLE,treap求调
  • 板块P1801 黑匣子
  • 楼主lw393
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/17 15:20
  • 上次更新2024/7/17 16:06:42
查看原帖
#11TLE,treap求调
1033990
lw393楼主2024/7/17 15:20
#include<iostream>
#include<cstdlib>
#include<ctime> 
using namespace std;
const int N = 2e5 + 5;
int arr[N], cnt, root;

struct node{
	int v, pri, lc, rc, num, size;
}tree[N];

int New(int v){
	tree[++cnt].v = v;
	tree[cnt].pri = rand();
	tree[cnt].num = tree[cnt].size = 1;
	tree[cnt].rc = tree[cnt].lc = 0;
	return cnt;
}

void update(int &p){
	tree[p].size = tree[tree[p].lc].size + tree[tree[p].rc].size + tree[p].num;
}

void zig(int &p){
	int q = tree[p].lc;
	tree[p].lc = tree[q].rc;
	tree[q].rc = p;
	tree[q].size = tree[p].size;
	update(p);
	p = q;
}

void zag(int &p){
	int q = tree[p].rc;
	tree[p].rc = tree[q].lc;
	tree[q].lc = p;
	tree[q].size = tree[p].size;
	update(p);
	p = q;
}

void Insert(int &p, int v){
	if(!p){
		p = New(v);
		return;
	}
	tree[p].size++;
	if(v == tree[p].v){
		tree[p].num++;
		return;
	}
	if(v < tree[p].v){
		Insert(tree[p].lc, v);
		if(tree[p].pri < tree[tree[p].lc].pri){
			zig(p);
		}
	}else{
		Insert(tree[p].rc, v);
		if(tree[p].pri < tree[tree[p].lc].pri){
			zag(p);
		}
	}
}

int find1(int &p, int x){
	if(!p){
		return 0;
	}
	int t = tree[tree[p].lc].size;
	if(t >= x){
		return find1(tree[p].lc, x);
	}else if(t + tree[p].num < x){
		return find1(tree[p].rc, x - t - tree[p].num);
	}else{
		return tree[p].v;
	} 
}

void print(int p){
	if(p){
		print(tree[p].lc);
		cout << tree[p].v << ' ' << tree[p].pri << ' ' << tree[p].num << ' ' << tree[p].size << ' ' << tree[tree[p].lc].v << ' ' << tree[tree[p].rc].v << endl;
		print(tree[p].rc);
	}
}

int main(){
	int n, m;
	srand(time(0));
	scanf("%d %d", &n, &m);
	for(int i = 1; i <= n; i++){
		scanf("%d", &arr[i]);
	}
	int index = 1;
	for(int i = 0; i < m; i++){
		int x;
		scanf("%d", &x);
		while(index <= x){
			Insert(root, arr[index]);
			index++;
			//print(root);
		}
		printf("%d\n", find1(root, i + 1));
	}
	return 0;
}
2024/7/17 15:20
加载中...