震惊!
查看原帖
震惊!
643323
weirdoX楼主2023/1/24 11:06

Acwing 398 这份代码90pts,TLE,可能被卡常了, 洛谷UVA,WA了???

#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
#define rnt register int
#define rep(i,l,r) for(int i = (int)l;i <= (int)r;i++)
#define per(i,r,l) for(int i = (int)r;i >= (int)l;i--)
#define pb push_back
#define all(a) a.begin(),a.end()
#define fi first
#define se second
#define mp make_pair
#define SZ(a) (int)(a.size())
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef long long ll;
typedef double db;

const int N = 2e4 + 10, inf = 1e9, P = inf + 7;
int n, m, k, tim, cnt, num;
int low[N], dfn[N], new_id[N], bel[N], ver[N], dep[N], fa[N][16], dis[N];
bool cut[N];
stack<int> stk;
vector<PII> eg[N];
VI ceg[N], cc[N];

inline void read (rnt &X){
	X = 0;rnt w = 0; char ch = 0;
	while (!isdigit (ch)) {w |= ch == '-'; ch = getchar  ();}
	while (isdigit(ch)) X = (X << 3) + (X << 1) + (ch ^ 48), ch = getchar ();
	if (w) X = -X;
}

void print(rnt res){
	if(res<0){putchar('-'); res=-res;}
	if(res>9) print(res/10);
	putchar(res%10+'0');
}

inline void init() {
	tim = cnt = 0;
	rep(i,1,2*n) {
		eg[i].clear();
		cc[i].clear();
		ceg[i].clear();
		dfn[i] = low[i] = dep[i] = dis[i] = 0;
	}
	while (!stk.empty()) stk.pop();
}

void dfs(rnt u) {
	dis[u] = dis[fa[u][0]] + (u > num);
	dep[u] = dep[fa[u][0]] + 1;
	for (auto v : ceg[u]) {
		if (dep[v]) continue;
		fa[v][0] = u;
		dfs(v);
	}
}

inline void Init() {
	rep(j,1,15)
		rep(i,1,n)
			fa[i][j] = fa[fa[i][j - 1]][j - 1];
}

inline int lca(rnt x, rnt y) {
	if (dep[x] < dep[y]) swap(x, y);
	per(i,15,0) if (dep[fa[x][i]] >= dep[y])
		x = fa[x][i];
	if (x == y) return x;
	per(i,15,0) if (fa[x][i] != fa[y][i]) {
		x = fa[x][i];
		y = fa[y][i];
	}
	return fa[x][0];
}

void tarjan(rnt u, rnt f) {
	dfn[u] = low[u] = ++tim;
	if (u == f && eg[u].empty()) {
		cc[++cnt].clear();
		cc[cnt].pb(u);
		return ;
	}
	stk.push(u);
	rnt ch = 0;
	for (auto [v, id] : eg[u]) {
		if (!dfn[v]) {
			ch++;
			tarjan(v, u);
			low[u] = min(low[u], low[v]);
			if (low[v] >= dfn[u]) {
				cut[u] = true;
				++cnt;
				while (true) {
					rnt t = stk.top();
					stk.pop();
					cc[cnt].pb(t);
					if (t == v) break;
				}
				cc[cnt].pb(u);
			}
		} else low[u] = min(low[u], dfn[v]);
	}
	if (u == f && ch <= 1)
		cut[u] = false;
}

int main() {	
	while(true) {
		read(n); read(m);
		if (!n && !m) break;
		init();
		rep(i,1,m) {
			rnt u, v;
			read(u); read(v);
			eg[u].pb({v, i});
			eg[v].pb({u, i});
		}
		rep(i,1,n) if (!dfn[i]) 
			tarjan(i, i);
		num = cnt;
		rep(i,1,n) if (cut[i])
			new_id[i] = ++cnt;
		rep(i,1,num) {
			for (auto u : cc[i]) {
				if (cut[u]) {
					ceg[i].pb(new_id[u]);
					ceg[new_id[u]].pb(i);
				}
				bel[u] = i;
			}
			for (auto u : cc[i])
				for (auto [v, id] : eg[u])
					if (bel[v] == bel[u])
						ver[id] = i;
		}
		rep(i,1,cnt) {
			sort(all(ceg[i]));
			ceg[i].erase(unique(all(ceg[i])), ceg[i].end());
		}
		rep(i,1,cnt) if (!dep[i]) {
			dep[i] = 1;
			dfs(i);
		}
		Init();
		rnt q;
		read(q);
		while (q--) {
			rnt u, v;
			read(u); read(v);
			u = ver[u], v = ver[v];
			rnt d = lca(u, v);
			print(dis[u] + dis[v] - dis[d] - dis[fa[d][0]]);
			putchar('\n');
		}
		fflush(0);
	}
	return 0;
}
2023/1/24 11:06
加载中...