20150302
20150303

BZOJ2770 YY的Treap

laekov posted @ 2015年3月03日 16:13 in 未分类 with tags bzoj ds , 655 阅读

今天考试题的弱化版。只用求LCA是谁,不用求它的深度。所以直接用线段树找下区间最值就搞定了。然后long的范围有负数坑了一发。

 

好像在不平衡的平衡树上的题也比较热啊。而且我还做得比较少。是要补一补。

 

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

typedef pair <int, int> vpr;
typedef pair <bool, vpr> dpr;
struct seg {
	int l, r;
	dpr d;
	seg *ls, *rs;
};
struct query {
	int t, a, b;
};

const int maxn = 400009;

int n, m, vl[maxn], tv;
vpr a[maxn];
query q[maxn];
seg slst[maxn * 3], *sp(slst), *rt;

inline int gpos(int x) {
	return lower_bound(vl, vl + tv, x) - vl;
}

#define midp(p) ((p->l+p->r)>>1)
inline seg* sgtBuild(int l, int r) {
	seg* p(sp ++);
	p-> l = l;
	p-> r = r;
	p-> d = dpr(1, vpr(0, 0));
	if (l + 1 < r) {
		p-> ls = sgtBuild(l, midp(p));
		p-> rs = sgtBuild(midp(p), r);
	}
	return p;
}
inline void sgtChg(seg* p, int p0, dpr v0) {
	if (p-> l + 1 == p-> r)
		p-> d = v0;
	else {
		if (p0 < midp(p))
			sgtChg(p-> ls, p0, v0);
		else 
			sgtChg(p-> rs, p0, v0);
		p-> d = min(p-> ls-> d, p-> rs-> d);
	}
}
inline dpr sgtQry(seg* p, int l, int r) {
	if (p-> l == l && p-> r == r)
		return p-> d;
	else if (r <= midp(p))
		return sgtQry(p-> ls, l, r);
	else if (l >= midp(p))
		return sgtQry(p-> rs, l, r);
	else
		return min(sgtQry(p-> ls, l, midp(p)), sgtQry(p-> rs, midp(p), r));
}

int main() {
#ifndef ONLINE_JUDGE
	freopen("in.txt", "r", stdin);
#endif

	scanf("%d%d", &n, &m);
	tv = 0;
	for (int i = 0; i < n; ++ i) {
		scanf("%d", &a[i]. second);
		vl[tv ++] = a[i]. second;
	}
	for (int i = 0; i < n; ++ i)
		scanf("%d", &a[i]. first);
	for (int i = 0; i < m; ++ i) {
		char opt[3];
		scanf("%s", opt);
		if (opt[0] == 'I') {
			q[i]. t = 1;
			scanf("%d%d", &q[i]. a, &q[i]. b);
			vl[tv ++] = q[i]. a;
		}
		else if (opt[0] == 'D') {
			q[i]. t = 2;
			scanf("%d", &q[i]. a);
		}
		else {
			q[i]. t = 3;
			scanf("%d%d", &q[i]. a, &q[i]. b);
		}
	}
	sort(vl, vl + tv);
	tv = unique(vl, vl + tv) - vl;
	rt = sgtBuild(0, tv);
	for (int i = 0; i < n; ++ i)
		sgtChg(rt, gpos(a[i]. second), dpr(0, a[i]));
	for (int i = 0; i < m; ++ i)
		if (q[i]. t == 1)
			sgtChg(rt, gpos(q[i]. a), dpr(0, vpr(q[i]. b, q[i]. a)));
		else if (q[i]. t == 2)
			sgtChg(rt, gpos(q[i]. a), dpr(1, vpr(0, 0)));
		else {
			int u(gpos(q[i]. a)), v(gpos(q[i]. b));
			if (u > v)
				swap(u, v);
			printf("%d\n", sgtQry(rt, u, v + 1). second. second);
		}
}

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter