이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int MAX_SOM=100*1000+5,MAX_REQ=100*1000+5,INFINI=(int)1000*1000*1000*1000*1000*1000;
int nbSom,nbAre,nbReq;
int debReq[MAX_REQ],finReq[MAX_REQ];
int debDicho[MAX_REQ],finDicho[MAX_REQ],quest[MAX_REQ];
bool ans[MAX_REQ];
vector<int> ajout[MAX_SOM];
unordered_map<int,int> corres;
int autreSens[MAX_SOM];
vector<pair<int,int>> adja[MAX_SOM];
int dist[MAX_SOM];
int pere[MAX_SOM];
vector<int> aRep[MAX_SOM];
int find(int pos) {
if (pere[pos]!=pos) {
pere[pos]=find(pere[pos]);
}
return pere[pos];
}
signed main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin>>nbSom>>nbAre;
int debAre,finAre,tailleAre;
for (int i=0;i<nbAre;i++) {
cin>>debAre>>finAre>>tailleAre;
adja[debAre].push_back({finAre,tailleAre});
adja[finAre].push_back({debAre,tailleAre});
}
for (int i=1;i<=nbSom;i++) {
dist[i]=INFINI;
}
int nbDeb,posDeb;
set<pair<int,int>> enCours;
set<pair<int,int>>::iterator it;
cin>>nbDeb;
for (int i=0;i<nbDeb;i++) {
cin>>posDeb;
enCours.insert({0,posDeb});
}
int distCour,pos;
while (!enCours.empty()) {
it=enCours.begin();
pos=(*it).second;
distCour=(*it).first;
enCours.erase(it);
if (dist[pos]==INFINI) {
dist[pos]=distCour;
for (auto k:adja[pos]) {
enCours.insert({distCour+k.second,k.first});
}
}
}
set<int> listeDist;
for (int i=1;i<=nbSom;i++) {
listeDist.insert(dist[i]);
}
int nbDist=0;
for (int i:listeDist) {
corres[i]=nbDist;
autreSens[nbDist]=i;
nbDist++;
}
for (int i=1;i<=nbSom;i++) {
ajout[corres[dist[i]]].push_back(i);
//cout<<i<<" : "<<dist[i]<<" "<<corres[dist[i]]<<endl;
}
cin>>nbReq;
for (int i=0;i<nbReq;i++) {
cin>>debReq[i]>>finReq[i];
if (debReq[i]==finReq[i]) {
debDicho[i]=corres[dist[debReq[i]]];
finDicho[i]=corres[dist[debReq[i]]];
}
else {
debDicho[i]=0;
finDicho[i]=nbDist-1;
}
}
for (int loop=0;loop<20;loop++) {
for (int i=1;i<=nbSom;i++) {
pere[i]=i;
}
for (int i=0;i<nbReq;i++) {
if (debDicho[i]!=finDicho[i]) {
quest[i]=(debDicho[i]+finDicho[i]+1)/2;
aRep[quest[i]].push_back(i);
}
}
for (int i=nbDist-1;i>=0;i--) {
for (int j:ajout[i]) {
//cout<<i<<" "<<j<<endl;
for (auto k:adja[j]) {
if (dist[k.first]>=autreSens[i] and find(k.first)!=find(j)) {
//cout<<"+"<<i<<" "<<j<<" "<<k.first<<endl;
pere[find(k.first)]=find(j);
}
}
}
for (int j:aRep[i]) {
//cout<<j<<" : "<<find(debReq[j])<<" "<<find(finReq[j])<<endl;
if (find(debReq[j])==find(finReq[j]) and dist[debReq[j]]>=autreSens[i] and dist[finReq[j]]>=autreSens[i]) {
ans[j]=true;
}
else {
ans[j]=false;
}
}
aRep[i].clear();
}
for (int i=0;i<nbReq;i++) {
if (debDicho[i]!=finDicho[i]) {
//cout<<i<<" : "<<debDicho[i]<<" "<<finDicho[i]<<" "<<quest[i]<<" "<<ans[i]<<endl;
if (ans[i]) {
debDicho[i]=quest[i];
}
else {
finDicho[i]=quest[i]-1;
}
}
}
}
for (int i=0;i<nbReq;i++) {
cout<<autreSens[debDicho[i]]<<"\n";
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |