제출 #152720

#제출 시각아이디문제언어결과실행 시간메모리
152720MercenaryOne-Way Streets (CEOI17_oneway)C++14
100 / 100
297 ms23260 KiB
#include<bits/stdc++.h>

using namespace std;
#define taskname "A"
#define pb	push_back
#define mp 	make_pair
#ifndef LOCAL
#define cerr if(0)cout
#endif

typedef long double ld;
typedef long long ll;
typedef pair<int,int> ii;
const int maxn = 1e5 + 5;

int n, m , p;

struct edge{
    int used , u , v , col;
}e[maxn];

vector<int> adj[maxn];
int num[maxn] , low[maxn];
static int nTime = 0 , nGroup = 0;

void DFS(int u){
    low[u] = num[u] = ++nTime;
    for(int c : adj[u]){
        if(e[c].used)continue;
        e[c].used = 1;
        int v = e[c].u + e[c].v - u;
        if(num[v] == 0){
            DFS(v);
            low[u] = min(low[u] , low[v]);
        }else{
            low[u] = min(low[u] , num[v]);
        }
    }
    for(int c : adj[u]){
        int v = e[c].u + e[c].v - u;
//        cout << u << " " << v << " " << c << " " << low[v] << " " << num[v] << endl;
        if(num[u] < num[v] && low[v] == num[v])e[c].col = -1;
    }
}

void DFS1(int u){
    num[u] = nGroup;
    for(int c : adj[u]){
        if(num[e[c].u + e[c].v - u] == 0 && e[c].col != -1){
            DFS1(e[c].u + e[c].v - u);
        }
    }
}

int par[maxn];
int path[maxn];

const int logn = 17;
int P[maxn][logn] , h[maxn];

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    if(fopen(taskname".INP","r")){
		freopen(taskname".INP", "r",stdin);
		freopen(taskname".OUT", "w",stdout);
    }
    cin >> n >> m;
    for(int i = 1 ; i <= m ; ++i){
        cin >> e[i].u >> e[i].v;
        adj[e[i].u].pb(i);
        adj[e[i].v].pb(i);
    }
    for(int i = 1 ; i <= n ; ++i){
        if(num[i] == 0)DFS(i);
    }
    fill_n(num,maxn,0);
    for(int i = 1 ; i <= n ; ++i){
        if(num[i] == 0){
            ++nGroup;
            DFS1(i);
        }
    }
    for(int i = 1 ; i <= n ; ++i){
        adj[i].clear();
    }
    for(int i = 1 ; i <= m ; ++i){
        e[i].u = num[e[i].u];
        e[i].v = num[e[i].v];
        if(e[i].col == -1){
            adj[e[i].u].pb(i);
            adj[e[i].v].pb(i);
        }
    }
    function<void(int)> DFS = [&](int u){
        low[u] = 1;
        for(int c : adj[u]){
            int v = e[c].u + e[c].v - u;
            if(low[v] == 1)continue;
            par[v] = c;
            path[v] = u;
            h[v] = h[u] + 1;
            P[v][0] = u;
            for(int i = 1 ; i < logn ; ++i){
                P[v][i] = P[P[v][i - 1]][i - 1];
            }
            DFS(v);
        }
    };
    fill_n(low,maxn,0);
    for(int i = 1 ; i <= nGroup ; ++i){
        if(low[i] == 0){
            DFS(i);
        }
    }
//    for(int i = 1 ; i <= nGroup ; ++i){
//        cout << i << " " << P[i][0] << endl;
//    }
    cin >> p;
    for(int i = 1 ; i <= p ; ++i){
        int u , v;cin >> u >> v;
        u = num[u];v = num[v];
        auto FindLCA = [&](int u , int v){
            if(h[u] < h[v])swap(u , v);
            for(int i = 0 ; i < logn ; ++i){
                if(((h[u] - h[v]) >> i) & 1){
                    u = P[u][i];
                }
            }
            if(u == v)return u;
            for(int i = logn - 1 ; i >= 0 ; --i){
                if(P[u][i] != P[v][i]){
                    u = P[u][i];
                    v = P[v][i];
                }
            }
            return P[u][0];
        };
        function<int(int)> FindPath = [&](int u){
                if(u == 0)return 0;
                if(e[par[path[u]]].col == -1)return path[u];
                return path[u] = FindPath(path[u]);
            };
        auto Travel = [&](int u , int v , int delta){
            while(h[u] > h[v]){
                int c = par[u];
//                if(e[c].col != -1)cout << c << endl;
                int pre = e[c].col;
                if(e[c].u == P[e[c].v][0]){
                    e[c].col = delta;
                }else{
                    e[c].col = 3 - delta;
                }
                u = FindPath(u);
            }
        };
        int c = FindLCA(u , v);
//        for(int j = 1 ; j <= nGroup ; ++j)cout << FindPath(j) << " ";cout << endl;
        Travel(u , c , 1);
        Travel(v , c , 2);
    }
    for(int i = 1 ; i <= m ; ++i){
        if(e[i].col <= 0)cout << "B";
        else if(e[i].col == 2)cout << "R";
        else cout << "L";
    }
}

컴파일 시 표준 에러 (stderr) 메시지

oneway.cpp: In lambda function:
oneway.cpp:148:21: warning: unused variable 'pre' [-Wunused-variable]
                 int pre = e[c].col;
                     ^~~
oneway.cpp: In function 'int main()':
oneway.cpp:65:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
   freopen(taskname".INP", "r",stdin);
   ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
oneway.cpp:66:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
   freopen(taskname".OUT", "w",stdout);
   ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...