萌新刚学oi,线段树#11 wa,求调,悬关
  • 板块P1801 黑匣子
  • 楼主Rosick
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/8/12 19:13
  • 上次更新2023/11/3 04:13:51
查看原帖
萌新刚学oi,线段树#11 wa,求调,悬关
773042
Rosick楼主2023/8/12 19:13
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
const int maxn = 2e5 + 5;

int n, m;
int ans[maxn << 2];
ll a[maxn], b[maxn];
int d[maxn << 2];

struct shabe{
	int p;
	int k;
}s[maxn];

void update(int l, int r, int tr, int len){
	if(l == r){
		++d[tr];
		return;
	}
	int mid = l + r >> 1;
	if(len <= mid) update(l, mid, tr << 1, len);
	else update(mid + 1, r, tr << 1 | 1, len);
	d[tr] = d[tr << 1] + d[tr << 1 | 1];
}

int get(int l, int r, int tr, int k){
	if(l == r)
		return b[l];
	int mid = l + r >> 1;
	if(d[tr << 1] >= k) return get(l, mid, tr << 1, k);
	else return get(mid + 1, r, tr << 1 | 1, k - d[tr << 1]);
}

void dict(){
	for(int i = 1; i <= n; ++i){
		scanf("%lld", &a[i]);
		b[i] = a[i];
	}
	sort(b + 1, b + n + 1);
	int len = unique(b + 1, b + n + 1) - b - 1;
	for(int i = 1; i <= n; ++i)
		a[i] = lower_bound(b + 1, b + n + 1, a[i]) - b;
	n = len;
}

bool cmp(shabe a, shabe b){
	return a.p < b.p;
}

void sol(){
	scanf("%d%d", &n, &m);
	dict();
	for(int i = 1; i <= m; ++i){
		scanf("%d", &s[i].p);
		s[i].k = i;
	}
	sort(s + 1, s + m + 1, cmp);
	int j = 1;
	for(int i = 1; i <= m; ++i){
		for(; j <= s[i].p; ++j)
			update(1, n, 1, a[j]);
		ans[s[i].k] = get(1, n, 1, s[i].k);
	}
	for(int i = 1; i <= m; ++i)
		printf("%d\n", ans[i]);
}

int main(){
	sol();
	return 0;
} 
2023/8/12 19:13
加载中...