MnZn求助
查看原帖
MnZn求助
963247
Slient_QwQ楼主2023/12/16 20:06

rt,MLE 60 pts,空间太毒瘤了

/*Code By Manipula*/
#include <bits/stdc++.h>
// #define Fileopen
// #pragma GCC optimize(2)
#define INF 0x3f3f3f3f
#define int long long
#define FOR(i, a, b) for (int i = a; i <= b; i++)
#define ROF(i, a, b) for (int i = a; i >= b; i--)
#define swap(x, y) x ^= y ^= x ^= y
#define sqrt(n) pow(n, 0.5)
#define sort stable_sort
#define mst(arr, num) memset(arr, num, sizeof(arr))
#define endl '\n'
using namespace std;
const int N = 1e5 + 5;
const int M = N * 10;
const int T = 2 * M + N;
struct Edge{
	int v, nxt;
}edge[M];
struct point{
	int x, y, k;
	bool operator < (const point rhs) const{
		return x < rhs.x || x == rhs.x && y < rhs.y;
	}
}a[N];
stack<int> st; 
int fx[8] = {-1, -1, -1, 0, 0, 1, 1, 1}, fy[8] = {-1, 0, 1, -1, 1, -1, 0, 1};
int head[T], dfn[T], low[T], col[T], val[T], rn[T], dp[T], uu[M], vv[M];
int n, r, c, m, scc, indx, num, top, tmp, ans;
void add(int u, int v){uu[++top] = u; vv[top] = v; edge[++num] = (Edge){v, head[u]}; head[u] = num;}
void Tarjan(int u)
{
	dfn[u] = low[u] = ++indx; st.push(u);
	for (int i = head[u]; i; i = edge[i].nxt)
	{
		int v = edge[i].v;
		if (!dfn[v])Tarjan(v), low[u] = min(low[u], low[v]);
		else if (!col[v])low[u] = min(low[u], dfn[v]);
	}
	if (dfn[u] == low[u])
	{
		val[col[u] = ++scc] = (u > r + c);
		int x;
		while (x = st.top(), st.pop(), x != u)val[col[x] = scc] += (x > r + c);
	}
}
void toposort()
{
	queue<int> q;
	for (int i = 1; i <= scc; i++)if (!rn[i])dp[i] = val[i], q.push(i);
	while (!q.empty())
	{
		int u = q.front(); q.pop();
		for (int i = head[u]; i; i = edge[i].nxt)
		{
			int v = edge[i].v;
			dp[v] = max(dp[v], dp[u] + val[v]);
			if (--rn[v] == 0)q.push(v);
		}
	}
}
int find(int x, int y)
{
	int l = 1, r = n;
	while (l <= r)
	{
		int mid = (l + r) >> 1;
		if (a[mid].x == x && a[mid].y == y)return mid;
		if (x < a[mid].x || x == a[mid].x && y < a[mid].y)r = mid - 1;
		else l = mid + 1;
	}
	return -1;
}
signed main()
{
	#ifdef Fileopen
		freopen(".in", r, stdin);
		freopen(".out", w, stdout);
	#endif
	cin >> n >> r >> c; m = r + c + n;
	FOR(i, 1, n)cin >> a[i].x >> a[i].y >> a[i].k;
	sort(a + 1, a + n + 1);
	FOR(i, 1, n)
	{
		add(a[i].x, r + c + i); add(r + a[i].y, r + c + i);
		if (a[i].k == 1)add(r + c + i, a[i].x);
		else if (a[i].k == 2)add(r + c + i, r + a[i].y);
		else FOR(j, 0, 7)
		{
			int x = a[i].x + fx[j], y = a[i].y + fy[j];
			if (x < 1 || x > r || y < 1 || y > c)continue;
			int k = find(x, y);
			if (k != -1)add(r + c + i, r + c + k);
		}
	}
	FOR(i, 1, m)if (!dfn[i])Tarjan(i);
	mst(head, 0); tmp = top; top = -1; num = 0;
	FOR(i, 1, tmp)if (col[uu[i]] != col[vv[i]])add(col[uu[i]], col[vv[i]]), rn[col[vv[i]]]++;
	toposort();
	FOR(i, 1, scc)ans = max(ans, dp[i]);
	cout << ans;
	return 0;
}
2023/12/16 20:06
加载中...