Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
37618 | LYLAKIOI | 【S】T4 | C++ | 运行超时 | 80 | 4000 MS | 235320 KB | 3509 | 2025-04-23 19:24:58 |
#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define p_b push_back using namespace std; typedef long long ll; const int maxn=3e5+10; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int lim; int n,r,a,b,mxd[maxn],dep[maxn]; int fa[maxn]; vector<int>E[maxn]; int ff[maxn],gg[maxn]; int f[maxn],g[maxn],h[maxn]; int mn[maxn]; priority_queue<pi,vector<pi>,greater<pi> >Q[maxn]; void dfs(int u){ set<int>S;S.insert(u);multiset<int>D; Q[u].push(m_p(u,dep[u])); for(int x:E[u])if(x!=fa[u]){ fa[x]=u,dep[x]=dep[u]+1; dfs(x);while(Q[x].size()&&Q[x].top().p2>dep[u]+b)Q[x].pop(); mn[x]=Q[x].size()?Q[x].top().p1:-1; if(Q[u].size()<Q[x].size())Q[u].swap(Q[x]); while(!Q[x].empty())Q[u].push(Q[x].top()),Q[x].pop(); S.insert(mn[x]); mxd[u]=max(mxd[u],mxd[x]+1);D.insert(mxd[x]+1); }mn[u]=*S.begin();D.insert(0); for(int x:E[u])if(x!=fa[u]){ S.erase(mn[x]);D.erase(D.lower_bound(mxd[x]+1)); gg[x]=(a>(*(--D.end())))?(*S.begin()):-1; S.insert(mn[x]);D.insert(mxd[x]+1); } ff[u]=(a>(*(--D.end())))?(*S.begin()):-1; } #define pq priority_queue<int,vector<int>,greater<int> > pq q[maxn]; map<int,int>M[maxn]; void mr(pq &a,pq &b){ if(a.size()<b.size())a.swap(b); while(!b.empty())a.push(b.top()),b.pop(); } void mrg(map<int,int>&a,map<int,int>&b){ if(a.size()<b.size())a.swap(b); for(auto it:b)a[it.p1]+=it.p2;b.clear(); } int tt[maxn]; void dfs2(int u){ M[u].clear();M[u][dep[u]]=1; multiset<int>A; for(int x:E[u])if(x!=fa[u])dfs2(x),tt[x]=M[x][dep[u]+a],mrg(M[u],M[x]),A.insert(mn[x]+1); if(ff[u]!=-1)f[u]=(ff[u]>=lim);else f[u]=M[u][dep[u]+a]; if(!f[u])mn[u]=0;else mn[u]=A.size()?(*A.begin()):(1e9); bool ok=0; for(int x:E[u])if(x!=fa[u]){ if(gg[x]!=-1)g[x]=(gg[x]>=lim); else { g[x]=M[u][dep[u]+a]!=tt[x]; } ok|=!g[x]; M[x].clear(); } int lm=A.size()?(*A.begin()):(1e9); for(int x:E[u])if(x!=fa[u]){ A.erase(A.lower_bound(mn[x]+1)); int lm=A.size()?(*A.begin()):(1e9); while(!q[x].empty()){ int p=q[x].top();q[x].pop(); if(p-dep[u]+lm<=b)M[u][p]--; else {q[x].push(p);break;} } A.insert(mn[x]+1); } if(!f[u])lm=0; if(ok)for(int x:E[u])if(x!=fa[u]){ int w=g[x]?b-1:b; while(!q[x].empty()){ int p=q[x].top();q[x].pop(); if(p-dep[u]<=w)M[u][p]--; else {q[x].push(p);break;} } } for(int x:E[u])mr(q[u],q[x]); if(lm>b)q[u].push(dep[u]); else M[u][dep[u]]--; } bool chk(int k){ lim=k+1;dfs2(r); return !f[r]; } void slv(){ n=read(),r=read(),a=read(),b=read(); if(a<=b)return printf("1\n"),void(); up(i,1,n-1){ int x=read(),y=read(); E[x].p_b(y),E[y].p_b(x); }dfs(r); int l=-1,r=n; while(l+1<r){ int mid=l+r>>1; if(chk(mid))r=mid; else l=mid; } cout<<r; } int main(){ //freopen("aba.in","r",stdin),freopen("aba.out","w",stdout); slv(); return 0; }