社区讨论

线段树分治求调,码风工整

CF19DPoints参与者 3已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@lp0x215u
此快照首次捕获于
2023/11/16 16:15
2 年前
此快照最后确认于
2023/11/16 17:57
2 年前
查看原帖
rt,代码复杂度 O(nlogn)O(n\log n)
CPP
#include <bits/stdc++.h> 

using namespace std;
const int N = 2e5 + 5;

int n;
struct OPT {
	string typ;
	int x, y;
	int hsh;
	OPT(string t = "", int X = 0, int Y = 0) {
		typ = t;
		x = X;
		y = Y;
	}
} q[N];

int cur = 0;
vector<OPT> qrys;

typedef pair<int, int> pii;
pii ans[N] = {};

void chk(int pos, vector<pii> v) { //从v里面查询ans[pos-1] 
//	printf("%d :", pos);
	pii res = make_pair(-1, -1);
	for (auto i: v) {
//		printf("(%d,%d) ", i.first, i.second);
		if ((i.first > qrys[pos - 1].x && i.second > qrys[pos - 1].y)) {
			if (res.first == -1)
				res = i;
			else if (res.first > i.first || (res.first == i.first && res.second > i.second))
				res = i;
		}
	}
	ans[pos] = res;
//	puts("");
}


struct SegmentTree {
	int sz;
	vector<vector<pii> > val;
	vector<pii> ide = vector<pii>();
	
	void build(int n) {
		for (sz = 1; sz < n; sz *= 2);
		val.assign(2 * sz, ide);
	}
	void mdf(int x, int lx, int rx, int l, int r, pii v) {
		if (l <= lx && rx <= r) {
			val[x].push_back(v);
			return ;
		}
		if (l >= rx || lx >= r)
			return ;
		int m = (lx + rx) / 2;
		mdf(x * 2, lx, m, l, r, v);
		mdf(x * 2 + 1, m, rx, l, r, v);
	}
	
	void dfs(int x, int lx, int rx, vector<pii> now) {
		for (int i = 0; i < val[x].size(); i++)
			now.push_back(val[x][i]);
		if (lx + 1 == rx) {
			chk(lx, now);
			for (int i = 0; i < val[x].size(); i++)
				now.pop_back();
			return ;
		}
		int m = (lx + rx) / 2;
		dfs(x * 2, lx, m, now);
		dfs(x * 2 + 1, m, rx, now);
		for (int i = 0; i < val[x].size(); i++)
			now.pop_back();
	}
} st;

map<pii, int> mp;
int L[N], R[N];

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> q[i].typ >> q[i].x >> q[i].y;
		if (q[i].typ == "add")
			mp[make_pair(q[i].x, q[i].y)];
	}
	cur = 0;
	for (auto &i: mp)
		i.second = ++cur;
	for (int i = 1; i <= n; i++) {
		if (q[i].typ == "find") {
			qrys.push_back(q[i]);
		}
		else
			q[i].hsh = mp[make_pair(q[i].x, q[i].y)];
	}
	st.build(qrys.size());
	cur = 0;
	for (int i = 1; i <= n; i++) {
		if (q[i].typ == "find")
			cur++;
		else {
			int tmp = q[i].hsh;
//			cout << q[i].x << ' ' << q[i].y << ':' << tmp << endl;
			if (q[i].typ == "add") {
				L[tmp] = cur + 1;
				R[tmp] = 0;
			}
			else {
				R[tmp] = cur;
				if (L[tmp] <= R[tmp])
					st.mdf(1, 1, st.sz + 1, L[tmp], R[tmp] + 1, make_pair(q[i].x, q[i].y));
			}
		}
	}
	
	for (int i = 1; i <= n; i++)
		if (q[i].typ == "add") {
			if (R[q[i].hsh] == 0) {
				R[q[i].hsh] = qrys.size();
				st.mdf(1, 1, st.sz + 1, L[q[i].hsh], R[q[i].hsh] + 1, make_pair(q[i].x, q[i].y));
			}
		}
	
	st.dfs(1, 1, st.sz + 1, vector<pii>());
	
	for (int i = 0; i < qrys.size(); i++)
		if (ans[i + 1].first == -1) {
			cout << -1 << endl;
		}
		else
			cout << ans[i + 1].first << ' ' << ans[i + 1].second << endl;
	return 0;
}

回复

5 条回复,欢迎继续交流。

正在加载回复...