QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#620850#8235. Top ClusterSoestxWA 0ms12140kbC++232.8kb2024-10-07 21:47:152024-10-07 21:47:16

Judging History

你现在查看的是最新测评结果

  • [2024-10-07 21:47:16]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:12140kb
  • [2024-10-07 21:47:15]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define fi first
#define se second
#define pll pair<int,int>
#define lowbit(x) (x&(-x))
typedef long long ll;
//typedef unsigned long long ull;
const int N = 1e6 + 10, M = 5e5, mod = 1e9+7;
const double eps=1e-11;
int n, m, k;
int res,ans;
int num[N],mp[N];


namespace Gra
{
	vector<pll> vt[N];
	int fa[N][30],dep[N],dp[N];
	
	void dfs(int id,int f)
	{
		cout<<id<<" "<<dp[id]<<endl;
		for(int i=1;(1<<i)<dep[id];i++)
		{
			fa[id][i]=fa[fa[id][i-1]][i-1];
		}
		for(auto it:vt[id])
		{
			int j=it.fi;
			if(j==f) continue;
			fa[j][0]=id;
			dep[j]=dep[id]+1;
			dp[j]=dp[id]+it.se;
			dfs(j,id);
		}
	}
	
	int lca(int a,int b)
	{
		if(dep[a]<dep[b]) swap(a,b);
		if(dep[a]!=dep[b])
		{
			int k=log2(dep[a]-dep[b]);
			for(int i=k;i>=0;i--)
			{
				if(dep[fa[a][i]]>=dep[b]) a=fa[a][i];
			}
		}
		if(a==b) return a;
		int k=log2(dep[a]);
		for(int i=k;i>=0;i--)
		{
			if(fa[a][i]==fa[b][i]) continue;
			a=fa[a][i];
			b=fa[b][i];
		}
		return fa[a][0];
	}
	
	void run()
	{
		fa[1][0]=1;
		dep[1]=1;
		dfs(1,-1);
	}
	
	int get(int a,int b)
	{
		if(dep[a]<dep[b]) swap(a,b);
		int d=lca(a,b);
		if(b==d) return dp[a]-dp[d];
		return dp[a]+dp[b]-2*dp[d];
	}
}
int L[N],R[N];

bool check(int mid,int x,int k)
{
	if(mid==0) return 1;
	int dl=Gra::get(x,L[mid]),dr=Gra::get(x,R[mid]);
	//cout<<mid<<" "<<x<<" "<<k<<" "<<L[mid]<<" "<<R[mid]<<" "<<dl<<" "<<dr<<endl;
	return (dl<=k&&dr<=k);
}



void solve() {
	cin>>n>>m;
	vector<pll> vt;
	vt.push_back({-1,-1});
	int lim=m;
	for(int i=1;i<=n;i++)
	{
		cin>>num[i];
		vt.push_back({num[i],i});
	}
	sort(vt.begin(),vt.end());
	for(int i=1;i<n;i++)
	{
		int u,v,w;
		cin>>u>>v>>w;
		Gra::vt[u].push_back({v,w});
		Gra::vt[v].push_back({u,w});
	}
	Gra::run();
	
	for(int i=1;i<=m;i++)
	{
		if(vt[i].first!=vt[i-1].first+1)
		{
			lim=i-1;
			break;
		}
		
		if(i==1)
		{
			L[i]=R[i]=vt[i].se;
			continue;
		}
		
		int u=L[i-1],v=R[i-1];
		int dis=Gra::get(u,v);
		int dl=Gra::get(u,vt[i].se),dr=Gra::get(v,vt[i].se);
		//cout<<u<<" "<<v<<" "<<dis<<" "<<dl<<" "<<dr<<" "<<vt[i].se<<endl;
		if(dl>=dr&&dl>dis) L[i]=L[i-1],R[i]=vt[i].se;
		else if(dr>=dl&&dr>dis) L[i]=vt[i].se,R[i]=R[i-1];
		else L[i]=L[i-1],R[i]=R[i-1];
	}
	//cout<<lim<<"---"<<endl;
	//for(int i=1;i<=lim;i++) cout<<i<<" "<<vt[i].fi<<" "<<L[i]<<" "<<R[i]<<endl;
	
	while(m--)
	{
		int x,k;
		cin>>x>>k;
		int l=0,r=lim;
		while(l<r)
		{
			int mid=(l+r+1)>>1;
			if(check(mid,x,k)) l=mid;
			else r=mid-1;
		}

		cout<<vt[l].fi+1<<endl;
	}

}

signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int T;
	T = 1;
	//cin >> T;
	while (T--) solve();
	return 0;
}
/*
*/

详细

Test #1:

score: 0
Wrong Answer
time: 0ms
memory: 12140kb

input:

5 4
3 9 0 1 2
1 2 10
3 1 4
3 4 3
3 5 2
3 0
1 0
4 6
4 7

output:

1 0
2 10
3 4
4 7
5 6
1
0
3
4

result:

wrong answer 3rd numbers differ - expected: '3', found: '2'