社区讨论
求助求助,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 条回复,欢迎继续交流。
正在加载回复...