E. Tree Queries——(LCA)

总结

当时没仔细读,读错题意了,害的我想了半天。

解析

找最长简单路径,排序深度从小到大,然后相邻的不断更新祖先,备用点与更新点祖先距离<=1,否则为NO

题目链接

//#pragma GCC optimize(2)
#include
//typedef long long ll;
#define ull       unsigned long long
#define int       long long
#define F           first
#define S           second
#define endl        "\n"//<
#define eps         1e-6
#define base        131
#define lowbit(x)   (x&(-x))
#define PI          acos(-1.0)
#define inf         0x3f3f3f3f
#define MAXN        0x7fffffff
#define INF         0x3f3f3f3f3f3f3f3f
#define pa          pair
#define ferma(a,b)  pow(a,b-2)
#define pb          push_back
#define all(x)      x.begin(),x.end()
#define memset(a,b) memset(a,b,sizeof(a));
#define IOS         ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
using namespace std;
void file()
{
#ifdef ONLINE_JUDGE
#else
    freopen("D:/LSNU/codeforces/duipai/data.txt","r",stdin);
    //  freopen("D:/LSNU/codeforces/duipai/cout.txt","w",stdout);
#endif
}
struct Lca
{
    vector<int>h;
    vector<vector<int> >fat,G;
    Lca(int n)
    {
        G.resize(n+1);
        h.resize(n+1);
        fat.resize(n+1,vector<int>(21));
    }
    void dfs(int x)
    {
        for(auto v:G[x])
        {
            if(v==fat[x][0])
                continue;
            h[v]=h[x]+1;
            fat[v][0]=x;
            dfs(v);
        }
    }
    void init(int n)
    {
        for(int i=1; i<=20; i++)
            for(int j=1; j<=n; j++)
                fat[j][i]=fat[ fat[j][i-1] ][i-1];
    }
    int lca(int x,int y)
    {
        if(h[x]<h[y])
            swap(x,y);
        for(int i=20; i>=0; i--)
            if( (h[x]-h[y])>>i )
                x=fat[x][i];
        if(x==y)
            return x;
        for(int i=20; i>=0; i--)
            if( fat[x][i]!=fat[y][i] )
                x=fat[x][i],y=fat[y][i];
        return fat[x][0];
    }
    int dis(int x,int y)
    {
        return h[x]+h[y]-h[lca(x,y)]*2;
    }
};
bool cmp(pair<int,int> a,pair<int,int> b)
{
    return a.S>b.S;
}
signed main()
{
    IOS;
    // file();
    int n,m;
    cin>>n>>m;
    Lca a(n);
    for(int i=1; i<n; i++)
    {
        int x,y;
        cin>>x>>y;
        a.G[x].pb(y);
        a.G[y].pb(x);
    }
    a.dfs(1);
    a.init(n);
    while(m--)
    {
        int cnt;
        cin>>cnt;
        vector<pair<int,int> >vec(cnt);
        for(auto &it:vec)
            cin>>it.F,it.S=a.h[it.F];
        sort(all(vec),cmp);
        int fat=vec[0].F,flag=1,len=vec.size();
        for(int i=1; i<len; i++)
        {
            int temp=a.lca(fat,vec[i].F);
            if(a.h[vec[i].F]-a.h[temp]<=1)
                fat=temp;
            else
            {
                flag=0;
                break;
            }
        }
        cout<<(flag?"YES":"NO")<<endl;
    }
    return 0;
}

你可能感兴趣的:(#,LCA)