求调
查看原帖
求调
550957
Anonymely楼主2023/12/21 16:26

拍不出来一点。

#include<bits/stdc++.h>
using namespace std;

#define QwQ330AwA return 0
#define ll long long

const int N = 5e5 + 5;
vector <int> e[N];
vector <int> L[N], R[N];
int dfn[N], tim;
int id[N];
int n, m;
struct Node {
	ll x, c;
} w[N];

namespace Seg {
	#define ls (p << 1)
	#define rs ((p << 1) | 1)
	vector <int> t[N << 2];
	int now[N << 2];
	const ll inf = 1e18;
	double slope(int i, int j) {
		return (double)((double)w[i].x * w[i].x + w[i].c - (double)w[j].x * w[j].x - w[j].c) / (w[i].x - w[j].x);
	}
	void upd(int p, int l, int r, int L, int R, int x) {
		if (L <= l && r <= R) {
			if (t[p].size() && w[t[p].back()].x == w[x].x) {
				if (w[t[p].back()].c >= w[x].c) t[p].pop_back();
				else return ;
			} 
			while (t[p].size() >= 2 && slope(t[p][t[p].size() - 2], t[p].back()) > slope(t[p].back(), x)) t[p].pop_back();
			t[p].push_back(x);
			return ;
		}
		int mid = (l + r) / 2;
		if (L <= mid) upd(ls, l, mid, L, R, x);
		if (mid < R) upd(rs, mid + 1, r, L, R, x);
	}
	ll query(int p, int l, int r, int x, ll y) {
		ll qwq = inf;
		while (now[p] + 1 < (int)t[p].size() && slope(t[p][now[p]], t[p][now[p] + 1]) <= 2 * y) now[p]++;
		if (now[p] < (int)t[p].size()) qwq = (y - w[t[p][now[p]]].x) * (y - w[t[p][now[p]]].x) + w[t[p][now[p]]].c;
		if (l == r) return qwq;
		int mid = (l + r) / 2;
		if (x <= mid) return min(qwq, query(ls, l, mid, x, y));
		else return min(qwq, query(rs, mid + 1, r, x, y));
	}
}

void dfs(int u) {
	dfn[u] = ++tim;
	if (id[u] > 0) L[id[u]].push_back(tim);
	if (id[u] < 0) R[-id[u]].push_back(tim - 1);
	for (auto v : e[u]) dfs(v);
	if (id[u] < 0) L[-id[u]].push_back(tim + 1);
	if (id[u] > 0) R[id[u]].push_back(tim);
}

int pos[N];
struct Ask {
	ll x, t;
	int id;
} q[N];
ll ans[N];

signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> n >> m >> w[0].c;
	w[0].x = 0;
	for (int i = 1; i < n; i++) {
		int op;
		cin >> op;
		if (op == 0) {
			int fa, id;
			cin >> fa >> id;
			assert(id < n);
			int y, z;
			cin >> w[id].x >> y >> z >> w[id].c;
			::id[i] = id;
			e[fa].push_back(i);
		} else {
			int fa, id;
			cin >> fa >> id;
			assert(id < n);
			::id[i] = -id;
			e[fa].push_back(i);
		}
	}
	dfs(0);
	for (int i = 0; i < n; i++) pos[i] = i;
	sort(pos, pos + n, [&](int u, int v) {
		return w[u].x < w[v].x;
	});
	//Seg::upd(1, 1, n, 1, n, 0);
	for (int i = 0; i < n; i++) {
		int x = pos[i];
		if (x == 0) Seg::upd(1, 1, n, 1, n, 0);
		for (int j = 0; j < (int)L[x].size(); j++) {
			int l = L[x][j], r = R[x][j];
			if (l <= r) Seg::upd(1, 1, n, l, r, x);
		}
	}
	for (int i = 1; i <= m; i++) cin >> q[i].x >> q[i].t, q[i].id = i;
	sort(q + 1, q + m + 1, [&](Ask u, Ask v) {
		return u.x < v.x;
	});
	for (int i = 1; i <= m; i++) ans[q[i].id] = Seg::query(1, 1, n, dfn[q[i].x], q[i].t);
	for (int i = 1; i <= m; i++) cout << ans[i] << '\n';
	QwQ330AwA;
}
2023/12/21 16:26
加载中...