社区讨论
线段树分治求调,码风工整
CF19DPoints参与者 3已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @lp0x215u
- 此快照首次捕获于
- 2023/11/16 16:15 2 年前
- 此快照最后确认于
- 2023/11/16 17:57 2 年前
rt,代码复杂度 。
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 条回复,欢迎继续交流。
正在加载回复...