Submission #340075

#TimeUsernameProblemLanguageResultExecution timeMemory
340075lukameladzeOne-Way Streets (CEOI17_oneway)C++14
100 / 100
836 ms78384 KiB
# include <bits/stdc++.h>
#define f first
#define s second
#define pb push_back
using namespace std;
const int N=2e5+5;
long long u,vv,n,m,t,lc,a[N],out[N],lv[N],b[N],fix[N],in[N],tin,p[N][20],low[N],brd[N];
vector < pair <long long, long long > > v[N];
map < pair < int, int >, int > ind;

long long pa[N];
map < pair <long long, long long > , long long> ans,brdg;
char ch[N];
int get_col(int a)
{
    if (a==pa[a]) return a;
    return pa[a]=get_col(pa[a]);
}
void dfs(int a, int b)
{
    fix[a]=1;
    tin++;
    in[a]=low[a]=tin;
    lv[a]=lv[b]+1;
    p[a][0]=b;
    for (int i=1; i<=18; i++)
    {
        p[a][i]=p[p[a][i-1]][i-1];
    }
    for (int i=0; i<v[a].size(); i++)
    {
        if (v[a][i].f==b) continue;
        if (fix[v[a][i].f])
        {
            low[a]=min(low[a],in[v[a][i].f]);
        }
        else
        {
            dfs(v[a][i].f,a);
            low[a]=min(low[a],low[v[a][i].f]);
            if (low[v[a][i].f]>in[a])
            {
                brdg[{v[a][i].f,a}]=1;
                brdg[{a,v[a][i].f}]=1;
                brd[v[a][i].s]=1;
            }
        }
    }
    out[a]=tin;
}
bool upper (int a, int b)
{
    if (in[a]<=in[b] && out[a]>=out[b]) return true;
    else return false;
}
int lca(int a, int b)
{
    if (upper(b,a)) return b;
    for (int i=18; i>=0; i--)
    {
        if (p[b][i] && !upper(p[b][i],a))
        b=p[b][i];
    }
    return p[b][0];
}
int main()
{
    cin>>n>>m;
    for (int i=1; i<=m; i++)
    {
        cin>>a[i]>>b[i];
        //if (a[i]==123 && b[i]==195) cout<<123<<" "<<195<<endl;
         //if (a[i]==195 && b[i]==123) cout<<123<<"   "<<195<<endl;
        v[a[i]].pb({b[i],i});
        v[b[i]].pb({a[i],i});
        
    }
  //  cout<<a[987-21]<<" "<<b[987-21]<<endl;
    for (int i=1; i<=n; i++)
    {
        if (!fix[i])
        {
            dfs(i,0);
        }
    }
    for (int i=1; i<=m; i++)
    {
        //if (a[i]==123 && b[i]==195) cout<<ind[{a[i],b[i]}]<<endl;
       // if (a[i]==195 && b[i]==123) cout<<ind[{a[i],b[i]}]<<endl;
        if (ind[{a[i],b[i]}]!=0)
        {
            brdg[{a[i], b[i]}]=brdg[{b[i],a[i]}]=0;
            brd[i]=0;
            brd[ind[{a[i],b[i]}]]=0;
        }
        ind[{a[i],b[i]}]=i;
        ind[{b[i],a[i]}]=i;
    }
    //cout<<brdg[{123,195}]<<endl;
    for (int i=1; i<=n; i++)
    {
        pa[i]=i;
    }
    cin>>t;
    while (t--)
    {
        cin>>u>>vv;
        lc=lca(u,vv);
        u=get_col(u);
        while (lv[u]>lv[lc])
        {
            if (brdg[{u,p[u][0]}] || brdg[{p[u][0],u}]) 
            {
                ans[{u,p[u][0]}]=1;
            }
            pa[u]=p[u][0];
            u=get_col(u);
        }
        vv=get_col(vv);
        while (lv[vv]>lv[lc])
        {
            if (brdg[{vv,p[vv][0]}] || brdg[{p[vv][0],vv}]) ans[{p[vv][0],vv}]=1;
            pa[vv]=p[vv][0];
            vv=get_col(vv);
        }
    }
    for (int i=1; i<=m; i++)
    {
        if (!brd[i]) 
        {
            cout<<"B";
            continue;
        }
        if (ans[{a[i],b[i]}]==1) cout<<"R";
        else if (ans[{b[i],a[i]}]==1) cout<<"L";
        else cout<<"B";
    }
}

Compilation message (stderr)

oneway.cpp: In function 'void dfs(int, int)':
oneway.cpp:30:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   30 |     for (int i=0; i<v[a].size(); i++)
      |                   ~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...