이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "highway.h"
#include <bits/stdc++.h>
using namespace std;
void find_pair(int n,vector<int>u,vector<int>v,int a,int b) {
int m=u.size();
vector<int>scuza(m,1);
int dist=ask(scuza)/b;
vector<int>d(n,0);
vector<int>vis(n,0);
vector<vector<pair<int,int>>>adj(n);
for(int i=0;i<m;++i){
adj[u[i]].push_back({v[i],i});
adj[v[i]].push_back({u[i],i});
}
vis[0]=1;
queue<int>q; q.push(0);
while (!q.empty()) {
int u=q.front(); q.pop();
for(auto it:adj[u]) {
int v=it.first;
if (!vis[v]) {
vis[v]=1; d[v]=d[u]+1; q.push(v);
}
}
}
vector<vector<int>>D(n); for(int i=0;i<n;++i) D[d[i]].push_back(i);
int l=1,r=n-1; while(l<r) {
int mid=(l+r)>>1;
vector<int>paiu=scuza;
for (int i=0;i<=mid;++i) for(auto u:D[i]) for(auto it:adj[u]) if(d[it.first]==d[u]-1) paiu[it.second]=0;
int x=ask(paiu); if(x<dist*b) r=mid; else l=mid+1;
}
vector<int> amog=D[r];
l=0,r=amog.size()-1; while(l<r) {
int mid=(l+r)>>1;
vector<int>paiu=scuza;
for(int i=l;i<mid;++i) for(auto it:adj[amog[i]]) if(d[it.first]==d[amog[i]]-1) paiu[it.second]=0;
int x=ask(paiu); if(x<dist*b) r=mid; else l=mid+1;
}
int bgn=amog[r];
vis.assign(n,0);
for(auto it:adj[bgn]) if(d[it.first]+1==d[bgn]) vis[it.first]=1;
vis[bgn]=1; q.push(bgn);
d.assign(n,1e9); d[bgn]=0;
while (!q.empty()) {
int u=q.front(); q.pop();
for(auto it:adj[u]) {
int v=it.first;
if(!vis[v]) {vis[v]=1; d[v]=d[u]+1; q.push(v);}
}
}
D.assign(n,vector<int>(0));
for(int i=0;i<n;++i) if(d[i]!=1e9)D[d[i]].push_back(i);
l=0,r=n-1;
while (l<r) {
int mid=(l+r)>>1;
vector<int>paiu=scuza;
for(int i=l;i<=mid;++i) for(auto u:D[i]) for(auto it:adj[u]) if(d[it.first]==d[u]-1) paiu[it.second]=0;
int x=ask(paiu); if(x<b*dist) r=mid; else l=mid+1;
}
amog=D[r]; l=0,r=amog.size()-1;
while(l<r) {
int mid=(l+r)>>1;
vector<int>paiu=scuza;
for(int i=l;i<=mid;++i) for(auto it:adj[amog[i]]) if(d[it.first]==d[amog[i]]-1) paiu[it.second]=0;
int x=ask(paiu); if(x<b*dist) r=mid; else l=mid+1;
}
int s=amog[r];
d.assign(n,0); vis.assign(n,0); vis[s]=1;
q.push(s);
while (!q.empty()) {
int u=q.front(); q.pop();
for (auto it:adj[u]) {
int v=it.first; if(!vis[v]) {vis[v]=1; d[v]=d[u]+1; q.push(v);}
}
}
D.assign(n,vector<int>(0));
for(int i=0;i<n;++i) D[d[i]].push_back(i);
amog=D[dist]; l=0,r=amog.size()-1;
while(l<r) {
int mid=(l+r)>>1;
vector<int>paiu=scuza;
for(int i=l;i<=mid;++i) for(auto it:adj[amog[i]]) if(d[it.first]==d[amog[i]]-1) paiu[it.second]=0;
int x=ask(paiu); if(x<b*dist) r=mid; else l=mid+1;
}
int t=amog[r];
answer(s,t);
}
# | 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... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |