Submission #1020130

#TimeUsernameProblemLanguageResultExecution timeMemory
1020130alexddJail (JOI22_jail)C++17
72 / 100
5084 ms924976 KiB
#include<bits/stdc++.h>
using namespace std;
int n,m;
vector<int> tree[120005],con[120005];
vector<int> son[120005],ton[120005];
pair<int,int> drum[120005];
int depth[120005],parent[120005],pos[120005],curpos,head[120005],siz[120005],cine[120005];
bool visited[120005];
void resetare()
{
    curpos=0;
    for(int i=1;i<=n;i++)
    {
        con[i].clear();
        tree[i].clear();
        son[i].clear();
        ton[i].clear();
        visited[i]=0;
    }
}

void dfs_tree(int nod)
{
    siz[nod]=1;
    for(auto adj:tree[nod])
    {
        if(adj!=parent[nod])
        {
            parent[adj]=nod;
            depth[adj]=depth[nod]+1;
            dfs_tree(adj);
            siz[nod]+=siz[adj];
        }
    }
}
void decompose(int nod, int chead)
{
    pos[nod]=++curpos;
    cine[pos[nod]]=nod;
    head[nod]=chead;
    int maxc=-1,heavy=-1;
    for(auto adj:tree[nod])
        if(adj!=parent[nod] && siz[adj]>maxc)
            maxc=siz[adj], heavy=adj;
    if(heavy!=-1)
        decompose(heavy,chead);
    for(auto adj:tree[nod])
        if(adj!=parent[nod] && adj!=heavy)
            decompose(adj,adj);
}


void baga_aint(int nod, int st, int dr, int le, int ri, int from)
{
    for(int i=le;i<=ri;i++)
    {
        for(auto x:son[cine[i]])
            con[x].push_back(from);
        for(auto x:ton[cine[i]])
            con[from].push_back(x);
    }
}
void baga_hld(int a, int b, int from)
{
    for(;head[a]!=head[b];b=parent[head[b]])
    {
        if(depth[head[a]]>depth[head[b]])
            swap(a,b);
        baga_aint(1,1,n,pos[head[b]],pos[b],from);
    }
    if(pos[a]>pos[b])
        swap(a,b);
    baga_aint(1,1,n,pos[a],pos[b],from);
}

vector<int> topo;
int topo_pos[120005];
void dfs_graph(int nod)
{
    visited[nod]=1;
    for(auto adj:con[nod])
        if(!visited[adj])
            dfs_graph(adj);
    topo.push_back(nod);
}
bool has_cycle()
{
    topo.clear();
    for(int i=1;i<=n;i++)
        if(!visited[i])
            dfs_graph(i);
    reverse(topo.begin(),topo.end());
    for(int i=0;i<topo.size();i++)
        topo_pos[topo[i]]=i;
    for(int i=0;i<topo.size();i++)
        for(auto x:con[topo[i]])
            if(topo_pos[x]<i)
                return 1;
    return 0;
}

signed main()
{
    ios_base::sync_with_stdio(0);cin.tie(0);
    int t;
    cin>>t;
    while(t--)
    {
        cin>>n;
        resetare();
        int a,b;
        for(int i=1;i<n;i++)
        {
            cin>>a>>b;
            tree[a].push_back(b);
            tree[b].push_back(a);
        }
        cin>>m;
        for(int i=1;i<=m;i++)
        {
            cin>>a>>b;
            drum[i]={a,b};
            son[a].push_back(i);
            ton[b].push_back(i);
        }
        dfs_tree(1);
        decompose(1,1);
        for(int i=1;i<=m;i++)
        {
            baga_hld(drum[i].first,drum[i].second,i);
        }

        if(has_cycle()) cout<<"No\n";
        else cout<<"Yes\n";
    }
    return 0;
}

Compilation message (stderr)

jail.cpp: In function 'bool has_cycle()':
jail.cpp:93:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   93 |     for(int i=0;i<topo.size();i++)
      |                 ~^~~~~~~~~~~~
jail.cpp:95:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   95 |     for(int i=0;i<topo.size();i++)
      |                 ~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...