MLE on #23 求助
查看原帖
MLE on #23 求助
299922
atarashiTLE楼主2023/11/8 11:37

拜谢。

#include <bits/stdc++.h>
#define re register
#define il inline
#define N 200010
using namespace std;
int dep[N], hd[N], lnsz, dfn[N], low[N], colsz, dfnt, inst[N], stk[N], stktp, n, m, u, v, q, sbtsz[N], ref_to_c[N], cnsz, fa[N], w[N], hs[N], rf[N], rft, refsz[N];
char op;
vector<int> ve[N];
multiset<int> pq[N];
struct SegmentTree
{
	int sz[800010];
	void pushup(int nw)
	{
		sz[nw] = min(sz[nw * 2], sz[nw * 2 + 1]);
	}
	void modify(int pos, int v, int nwL = 1, int nwR = 131072, int nw = 1)
	{
		if (nwL == nwR)
		{
			sz[nw] = v;
			return;
		}
#define M ((nwL + nwR) >> 1)
		if (pos > M)
			modify(pos, v, M + 1, nwR, nw * 2 + 1);
		else
			modify(pos, v, nwL, M, nw * 2);
#undef M
		pushup(nw);
	}
	int ask(int R, int L = 1, int nw = 1, int nwL = 1, int nwR = 131072)
	{
		if (R < L)
			return 2147483647;
		if (L <= nwL && nwR <= R)
			return sz[nw];
		int tmp = 2147483647;
#define M ((nwL + nwR) >> 1)
		if (R > M)
			tmp = min(tmp, ask(R, max(L, M + 1), nw * 2 + 1, M + 1, nwR));
		if (L <= M)
			tmp = min(tmp, ask(min(R, M), L, nw * 2, nwL, M));
#undef M
		return tmp;
	}
} Tree;
struct chain
{
	int tp, ed;
} cn[100010];
struct ln
{
	int u, v, nxt;
} a[500010];
void mrg(int u, int v)
{
	a[++lnsz].u = u;
	a[lnsz].v = v;
	a[lnsz].nxt = hd[u];
	hd[u] = lnsz;
}
void tarjan(int nw, int fa)
{
	int snt = 0;
	dfn[nw] = low[nw] = ++dfnt;
	stk[++stktp] = nw, inst[nw] = 1;
	for (int i = hd[nw]; i; i = a[i].nxt)
	{
		if (!dfn[a[i].v])
		{
			snt++;
			tarjan(a[i].v, nw);
			low[nw] = min(low[nw], low[a[i].v]);
			if (low[a[i].v] >= dfn[nw])
			{
				colsz++;
				while (stk[stktp + 1] != a[i].v)
					ve[colsz + n].emplace_back(stk[stktp]), ve[stk[stktp--]].emplace_back(colsz + n);
				ve[colsz + n].emplace_back(nw);
				ve[nw].emplace_back(colsz + n);
			}
		}
		else if (inst[a[i].v])
			low[nw] = min(low[nw], dfn[a[i].v]);
	}
}
void dfs1(int nw, int fa)
{
	dep[nw] = dep[fa] + 1;
	sbtsz[nw] = 1;
	::fa[nw] = fa;
	for (int v : ve[nw])
	{
		if (v == fa)
			continue;
		dfs1(v, nw);
		sbtsz[nw] += sbtsz[v];
		if (sbtsz[v] > sbtsz[hs[nw]])
			hs[nw] = v;
	}
}
void dfs2(int nw, int cn)
{
	rf[nw] = ++rft;
	if (nw <= n)
		Tree.modify(rf[nw], w[nw]), refsz[nw] = w[nw];
	else
	{
		for (int v : ve[nw])
			if (v != fa[nw])
				pq[nw - n].emplace(w[v]);
		Tree.modify(rf[nw], refsz[nw] = *pq[nw - n].begin());
	}
	ref_to_c[nw] = cn;
	if (ve[nw].empty())
	{
		::cn[cn].ed = nw;
		return;
	}
	if (hs[nw])
		dfs2(hs[nw], cn);
	for (int v : ve[nw])
	{
		if (v == fa[nw] || v == hs[nw])
			continue;
		::cn[++cnsz].tp = v;
		dfs2(v, cnsz);
	}
}
int lca(int a, int b)
{
	int ans = 2147483647;
	while (ref_to_c[a] != ref_to_c[b])
	{
		if (dep[cn[ref_to_c[a]].tp] < dep[cn[ref_to_c[b]].tp])
		{
			ans = min(ans, Tree.ask(rf[b], rf[cn[ref_to_c[b]].tp]));
			b = fa[cn[ref_to_c[b]].tp];
		}
		else
		{
			ans = min(ans, Tree.ask(rf[a], rf[cn[ref_to_c[a]].tp]));
			a = fa[cn[ref_to_c[a]].tp];
		}
	}
	if (dep[a] < dep[b])
		return min(min(ans, a > n ? refsz[fa[a]] : 2147483647), Tree.ask(rf[b], rf[a]));
	return min(min(ans, b > n ? refsz[fa[b]] : 2147483647), Tree.ask(rf[a], rf[b]));
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(), cout.tie();
	memset(Tree.sz, 0x3f, sizeof(Tree.sz));
	memset(refsz, 0x3f, sizeof(refsz));
	cin >> n >> m >> q;
	for (int i = 1; i <= n; i++)
		cin >> w[i];
	for (int i = 1; i <= m; i++)
	{
		cin >> u >> v;
		mrg(u, v);
		mrg(v, u);
	}
	for (int i = 1; i <= n; i++)
		if (!dfn[i])
			stktp = 0, tarjan(i, 0);
	dfs1(1, 0);
	cn[++cnsz].tp = 1;
	Tree.modify(1, w[1]);
	dfs2(1, 1);
	while (q--)
	{
		cin >> op >> u >> v;
		if (op == 'C')
		{
			if (fa[u])
			{
				pq[fa[u] - n].erase(w[u]);
				pq[fa[u] - n].insert(v);
				Tree.modify(rf[fa[u]], refsz[fa[u]] = *pq[fa[u] - n].begin());
			}
			Tree.modify(rf[u], v);
			refsz[u] = v;
			w[u] = v;
		}
		else
			cout << lca(u, v) << '\n';
	}
	return 0;
}
2023/11/8 11:37
加载中...