제출 #1068212

#제출 시각아이디문제언어결과실행 시간메모리
1068212Faisal_Saqib통행료 (IOI18_highway)C++17
12 / 100
221 ms262144 KiB
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define ll long long
long long ask(const std::vector<int> &w);
void answer(int s, int t);
const ll NP=1e5;
vector<pair<ll,ll>> ma[NP],tmp;
vector<int> w;
ll mi,a,b,par[NP],vis[NP];
ll wantd;
vector<int> ans;
void dfs(int x,int p=-1,ll d=0)
{
	par[x]=p;
	if(d==(wantd))
		ans.pb(x);
	for(auto y:ma[x])
	{
		if(y.second!=p)
		{
			dfs(y.second,x,d+1);
		}
	}
}
map<pair<int,int>,int> edg;
void find_pair(int n, std::vector<int> u, std::vector<int> v, int A, int B)
{
	int m=u.size();
	w.resize(m,0);
	a=A;
	b=B;
	mi=ask(w);
	wantd=(mi/a);
	for(int i=0;i<n;i++)
		ma[i].clear();
	for(int i=0;i<m;i++)
	{
		edg[{u[i],v[i]}]=i;
		edg[{v[i],u[i]}]=i;
		ma[u[i]].pb({i,v[i]});
		ma[v[i]].pb({i,u[i]});
	}
	dfs(0);
	int s=-1;
	int e=ans.size();
	while(s+1<e)
	{
		int mid=(s+e)/2;
		for(int i=0;i<n;i++)
			vis[i]=0;
		vector<int> cur;
		for(int j=s+1;j<=mid;j++)
		{
			int s=ans[j];
			while(s!=0)
			{
				if(vis[s])break;
				vis[s]=1;
				cur.push_back(edg[{s,par[s]}]);
				s=par[s];
			}
		}
		for(auto i:cur)
			w[i]=1;
		ll wa=ask(w);
		for(auto i:cur)
			w[i]=0;
		if(wa==(b*wantd))
		{
			e=mid;
		}
		else
		{
			s=mid;
		}
	}
	answer(0,ans[e]);
}
#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...