社区讨论

求助求助,tarjan+topsort 25pts

P9431[NAPC-#1] Stage3 - Jump Refreshers参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mhj9g1qh
此快照首次捕获于
2025/11/03 22:53
4 个月前
此快照最后确认于
2025/11/03 22:53
4 个月前
查看原帖
就WA了几个点
CPP
#include<bits/stdc++.h>
#define ll long long
#define fi first
#define se second
using namespace std;
const int N = 2e6 + 10;
const int MOD = 1e9;
template<typename TY>
inline void read(TY &s){
	ll x = 0, f = 1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	s = x * f;
}
int n,d,c;
int dfn[N],low[N],tim,stk[N],top,scc[N],tot;
int ind[N],cnt,siz[N];
int f[N];
bool vis[N];
pair<int,int> E[N];
vector<int> e[N];
void tarjan(int u){
	low[u] = dfn[u] = ++tim; stk[++top] = u;
	for(auto x : e[u]){
		if(!dfn[x]){
			tarjan(x);
			low[u] = min(low[u],low[x]);
		}
		else if(!scc[x]){
			low[u] = min(low[u],dfn[x]);
		}
	}
	if(dfn[u] == low[u]){
		tot++;
		while(1){
			int v = stk[top--];
			scc[v] = tot;
			siz[tot]++;
			if(u == v) break;
		}
	}
}
int x[N],y[N];
bool check(int x,int y,int xx,int yy){
	if(yy > y + d) return false;
	int k = y + d - yy;
	if(xx >= x - k && xx <= x + k) return true;
	return false;
}
void solve(){
	read(n); read(d); read(c);
	for(int i=1;i<=n;i++) f[i] = siz[i] = vis[i] = ind[i] = dfn[i] = scc[i] = 0;
	for(int i=1;i<=n;i++) e[i].clear(); cnt = top = tot = tim = 0; 
	for(int i=1;i<=n;i++){
		read(x[i]); read(y[i]);
	}
	map<int,map<int,bool> > mp;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(i == j) continue;
			if(check(x[i],y[i],x[j],y[j])){
				e[i].push_back(j); 
//				cerr<<x[i]<<" "<<y[i]<<" "<<x[j]<<" "<<y[j]<<"IJ\n";
				E[++cnt] = {i,j};
			}
		}
	}
	for(int i=1;i<=n;i++){
		if(!dfn[i]) tarjan(i);
	}
	for(int i=1;i<=n;i++) e[i].clear();
	for(int i=1;i<=cnt;i++){
		int u = scc[E[i].fi], v = scc[E[i].se];
		if(u != v){
			if(mp[u][v]) continue;
			e[u].push_back(v); mp[u][v] = true;
			ind[v]++;
		}
	}
	int ans = 0;
	queue<int> Q;
	for(int i=1;i<=tot;i++){
		if(!ind[i]){
			Q.push(i);
		}
	}
	ans = f[scc[c]] = siz[scc[c]]; vis[scc[c]] = 1;
	while(!Q.empty()){
		int u = Q.front();
		Q.pop();
		for(auto x : e[u]){
			ind[x]--;
			if(!ind[x]) Q.push(x);
			if(vis[u]){
				f[x] = max(f[x],f[u] + siz[x]);
				ans = max(ans,f[x]);
				vis[x] = 1;
			}
		}
	}
	cout << ans << "\n";
}
int main(){
	int T,id;
	read(T); read(id);
	while(T--) solve();
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...