Submission #1264483

#TimeUsernameProblemLanguageResultExecution timeMemory
1264483inesfiOne-Way Streets (CEOI17_oneway)C++20
100 / 100
77 ms32824 KiB
#include<bits/stdc++.h> using namespace std; #define int long long const int TAILLEMAXI=100*1000+2; int nbnoeuds,nbaretes,nbpaires; vector<pair<int,int>> aretes,paires; vector<pair<int,int>> adja[TAILLEMAXI]; // numar,voisin vector<bool> essentiel; int dejavu[TAILLEMAXI],plush[TAILLEMAXI]; int numcompo[TAILLEMAXI]; vector<pair<int,int>> nouvadja[TAILLEMAXI]; vector<int> enfants[TAILLEMAXI]; int enbas[TAILLEMAXI]; int cumu[TAILLEMAXI]; bool vu[TAILLEMAXI]; bool vudfs2[TAILLEMAXI]; int plushaut(int a,int vient,int p){ //cout<<a<<endl; if (dejavu[a]!=-1){ essentiel[vient]=false; //cout<<a<<endl; return dejavu[a]; } dejavu[a]=p; plush[a]=p; for (auto v:adja[a]){ if (v.first!=vient){ plush[a]=min(plush[a],plushaut(v.second,v.first,p+1)); } } //cout<<a<<endl; return plush[a]; } void dfs(int a,int c){ if (numcompo[a]!=-1){ return ; } numcompo[a]=c; for (auto v:adja[a]){ if (essentiel[v.first]==false){ dfs(v.second,c); } } } void dfs2(int a,int vient,int pere){ if (vient!=-1){ enbas[vient]=a; //cout<<"enbas "<<vient<<" = "<<a<<" haut "<<pere<<endl; } vudfs2[a]=true; for (auto v:nouvadja[a]){ if (v.first!=vient){ dfs2(v.second,v.first,a); enfants[a].push_back(v.second); } } } int dp(int a){ vu[a]=true; for (auto v:enfants[a]){ cumu[a]+=dp(v); } return cumu[a]; } void affiche_essentiel(){ for (int i=0;i<nbaretes;i++){ if (essentiel[i]){ cout<<i<<" deb "<<aretes[i].first<<" fin "<<aretes[i].second<<endl; } } } signed main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>nbnoeuds>>nbaretes; for (int i=0;i<nbaretes;i++){ int d,f; cin>>d>>f; aretes.push_back({d-1,f-1}); essentiel.push_back(true); adja[d-1].push_back({i,f-1}); adja[f-1].push_back({i,d-1}); } cin>>nbpaires; for (int i=0;i<nbpaires;i++){ int d,f; cin>>d>>f; paires.push_back({d-1,f-1}); } for (int i=0;i<nbnoeuds;i++){ dejavu[i]=-1; numcompo[i]=-1; } for (int i=0;i<nbnoeuds;i++){ if (dejavu[i]==-1){ plushaut(i,-1,0); } //cout<<"prof "<<dejavu[i]<<" plush "<<plush[i]<<endl; } for (int i=0;i<nbaretes;i++){ pair<int,int> ar=aretes[i]; if (dejavu[ar.first]<dejavu[ar.second]){ if (plush[ar.second]<=dejavu[ar.first]){ essentiel[i]=false; } } else { if (plush[ar.first]<=dejavu[ar.second]){ essentiel[i]=false; } } } //affiche_essentiel(); //return 0; int num=0; for (int i=0;i<nbnoeuds;i++){ if (numcompo[i]==-1){ dfs(i,num); num++; } //cout<<numcompo[i]<<" "; } //cout<<endl; for (int i=0;i<nbaretes;i++){ if (essentiel[i]){ nouvadja[numcompo[aretes[i].first]].push_back({i,numcompo[aretes[i].second]}); nouvadja[numcompo[aretes[i].second]].push_back({i,numcompo[aretes[i].first]}); } } for (int i=0;i<num;i++){ if (vudfs2[i]==false){ dfs2(i,-1,-1); } } for (auto p:paires){ cumu[numcompo[p.first]]++; cumu[numcompo[p.second]]--; } for (int i=0;i<num;i++){ if (vu[i]==false){ dp(i); } } /*for (int i=0;i<num;i++){ cout<<cumu[i]<<endl; }*/ for (int i=0;i<nbaretes;i++){ if (essentiel[i]==false){ cout<<'B'; } else { if (cumu[enbas[i]]==0){ cout<<'B'; } else if (cumu[enbas[i]]>0){ if (numcompo[aretes[i].first]==enbas[i]){ cout<<'R'; } else { cout<<'L'; } } else { if (numcompo[aretes[i].first]==enbas[i]){ cout<<'L'; } else { cout<<'R'; } } } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...