为什么MLE了?
查看原帖
为什么MLE了?
773878
xukehg楼主2024/7/22 11:12

256MB怎么会MLE?

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;

int n,m,q;
struct node{
	int to;
	int nxt;
}edge[N << 1];
int head[N];
int tott,cntt;
void addedge(int u,int v){
	edge[++tott].to = v;
	edge[tott].nxt = head[u];
	head[u] = tott;
}
int dfn[N],low[N],tot;
int col[N],belong[N];
int vis[N << 1];
int colors;
vector<int> e[N];
void tarjan(int x,int fa){
	dfn[x] = low[x] = ++tot;
	for (int i = head[x],y;i;i = edge[i].nxt){
		y = edge[i].to;
		if (y == fa) continue;
		if (!dfn[y]){
			tarjan(y,x);
			low[x] = min(low[x],low[y]);
			if (low[y] > dfn[x]) vis[i] = vis[i ^ 1] = 1;
		}
		else low[x] = min(low[x],dfn[y]);
	}
	return;
}
void dfs1(int u){
	col[u] = colors;
	for (int i = head[u];i;i = edge[i].nxt){
		int v = edge[i].to;
		if (col[v] || vis[i]) continue;
		dfs1(v);
	}
	return;
}
int dep[N],father[N][20];
void dfs2(int u,int fa){
	belong[u] = cntt;
	dep[u] = dep[fa] + 1;
	father[u][0] = fa;
	for (int i = 1;(1 << i) <= dep[u];i++){
		father[u][i] = father[father[u][i - 1]][i - 1];
	}
	for (auto v : e[u]){
		if (v == fa) continue;
		dfs2(v,u); 
	}
	return;
} 
int get_lca(int u,int v){
	if (dep[u] < dep[v]) swap(u,v);
	for (int i = 19;i >= 0;i--){
		if (dep[u] - (1 << i) >= dep[v]) u = father[u][i];
	}
	if (u == v) return u;
	for (int i = 19;i >= 0;i--){
		if (father[u][i] != father[v][i]){
			u = father[u][i];
			v = father[v][i];
		}
	}
	return father[u][0];
}
int up[N],down[N];
bool check(int u,int fa){
	for (int v : e[u]){
		if (v == fa) continue;
		if (!check(v,u) || (up[v] && down[v])) return false;
		up[u] += up[v];
		down[u] += down[v];
	}
	return true;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin >> n >> m >> q;
	for (int i = 1,u,v;i <= m;i++){
		cin >> u >> v;
		addedge(u,v);
		addedge(v,u);
	}
	for (int i = 1;i <= n;i++) if (!dfn[i]) tarjan(i,0);
	for (int i = 1;i <= n;i++) if (!col[i]) colors++,dfs1(i);
	for (int u = 1;u <= n;u++){
		for (int i = head[u];i;i = edge[i].nxt){
			int v = edge[i].to;
			if (col[v] > col[u]){
				e[col[u]].push_back(col[v]);
				e[col[v]].push_back(col[u]);
			}
		}
	}
	for (int i = 1;i <= colors;i++) if (!belong[i]) cntt++,dfs2(i,0);
	for (int i = 1,u,v,lca;i <= q;i++){
		cin >> u >> v;
		u = col[u],v = col[v];
		if (u == v) continue;
		if (belong[u] != belong[v]){
			cout << "No" << endl;
			return 0;
		}
		lca = get_lca(u,v);
		up[u]++,up[lca]--;
		down[v]++,down[lca]--;
	}
	for (int i = 1;i <= colors;i++){
		if (!father[i][0] && !check(i,0)){
			cout << "No" << endl;
			return 0;
		}
	}
	cout << "Yes" << endl;
	return 0;
}
2024/7/22 11:12
加载中...