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;
}