제출 #714232

#제출 시각아이디문제언어결과실행 시간메모리
714232alvingogo통행료 (IOI18_highway)C++14
6 / 100
123 ms8784 KiB
#include "highway.h"
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#define AquA cin.tie(0);ios_base::sync_with_stdio(0);
#define fs first
#define sc second
#define p_q priority_queue
using namespace std;

struct no{
	vector<pair<int,int> > ch;
};
vector<no> v;
int n;
int a,b;
long long dis;
vector<int> chg;
int find_one(int rt,vector<pair<int,int> >& x){
	int l=0,r=(int)(x.size())-1;
	while(r>l){
		int mid=(l+r)/2;
		for(int i=0;i<=mid;i++){
			chg[x[i].sc]=1;
		}
		if(ask(chg)!=dis){
			r=mid;
		}
		else{
			l=mid+1;
		}
		for(int i=0;i<=mid;i++){
			chg[x[i].sc]=0;
		}
	}
	return x[l].fs;
}
void find_pair(int N, vector<int> U, vector<int> V, int A, int B) {
	a=A;
	b=B;
	n=N;
	v.resize(n);
	int m=U.size();
	for(int i=0;i<m;i++){
		v[U[i]].ch.push_back({V[i],i});
		v[V[i]].ch.push_back({U[i],i});
	}
	int l=0,r=m-1;
	chg.resize(m,0);
	dis=ask(chg);
	while(r>l){
		int mid=(l+r)/2;
		for(int i=0;i<=mid;i++){
			chg[i]=1;
		}
		if(ask(chg)==dis){
			l=mid+1;
		}
		else{
			r=mid;
		}
		for(int i=0;i<=mid;i++){
			chg[i]=0;
		}
	}
	//edge = U[l],V[l];
	queue<int> q;
	vector<int> vis(n);
	q.push(U[l]);
	q.push(V[l]);
	vis[U[l]]=1;
	vis[V[l]]=-1;
	vector<pair<int,int> > c,d;
	c.push_back({U[l],-1});
	d.push_back({V[l],-1});
	while(q.size()){
		auto h=q.front();
		q.pop();
		for(auto y:v[h].ch){
			if(!vis[y.fs]){
				vis[y.fs]=vis[h];
				q.push(y.fs);
				if(vis[h]==1){
					c.push_back(y);
				}
				else{
					d.push_back(y);
				}
			}
			else{
				chg[y.sc]=1;
			}
		}
	}
	reverse(c.begin(),c.end());
	reverse(d.begin(),d.end());
	for(auto h:d){
		if(h.sc<0){
			continue;
		}
		chg[h.sc]=1;
	}
	dis=ask(chg);
	int e=find_one(U[l],c);
	for(auto h:d){
		if(h.sc<0){
			continue;
		}
		chg[h.sc]=0;
	}
	for(auto h:c){
		if(h.sc<0){
			continue;
		}
		chg[h.sc]=1;
	}
	dis=ask(chg);
	int f=find_one(V[l],d);
	answer(e,f);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...