社区讨论

只 AC 了一个点,求条

P13824 「Diligent-OI R2 D」在水一方参与者 2已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@mhjd82q2
此快照首次捕获于
2025/11/04 00:39
4 个月前
此快照最后确认于
2025/11/04 00:39
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1005;
int n,t,x[N],y[N],id[N][N],dis[N][N],f[N],lg[N],tot;
vector<int> G[N*N],H[N*N],g[N];
int dist(int i,int j){
	return (x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);
}
void dfs(int u,int fa,int st,int d){
	if(st==1) f[u]=fa;
	dis[st][u]=d;
	for(auto v:g[u])
		if(v!=fa) dfs(v,u,st,d+dist(v,u));
}
struct node{
	int lim,dis,u,v;
	bool operator<(node b){
		return lim<b.lim;
	}
}mx[N*N],vc[N*N];
node max(node a,node b){
	if(a.dis!=b.dis) return a.dis>b.dis?a:b;
	if(a.u!=b.u) return a.u<b.u?a:b;
	return a.v<b.v?a:b;
}
pair<int,int> qr[N*100],ans[N*100];
queue<int> q;
int dp[N*N],d[N*N],w[N*N];
void add(int u,int v){
	H[u].push_back(v);
	G[v].push_back(u);
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n>>t;
	for(int i=1;i<=n;i++)
		cin>>x[i]>>y[i];
	for(int i=2;i<=n;i++) lg[i]=lg[i/2]+1;
	for(int i=1,u,v;i<n;i++){
		cin>>u>>v;
		g[u].push_back(v);
		g[v].push_back(u);
	}
	for(int i=1;i<=n;i++) dfs(i,0,i,0);
	for(int i=1;i<=n;i++)
		for(int j=i;j<=n;j++){
			id[i][j]=id[j][i]=++tot;
			w[tot]=dist(i,j);
		}
	for(int i=1;i<=n;i++)
		for(int j=i;j<=n;j++){
			if(f[i]&&f[j]){
				add(id[i][j],id[f[i]][f[j]]);
				d[id[i][j]]++;
			}
			if(f[i]){
				add(id[i][j],id[f[i]][j]);
				d[id[i][j]]++;
			}
			if(f[j]){
				add(id[i][j],id[i][f[j]]);
				d[id[i][j]]++;
			}
		}
	for(int i=1;i<=tot;i++)
		if(!d[i]) q.push(i);
	while(!q.empty()){
		int u=q.front();q.pop();
		if(u>1) dp[u]=1e9;
		for(auto v:H[u])
			dp[u]=min(dp[u],dp[v]);
		dp[u]=max(dp[u],w[u]);
		for(auto v:G[u]){
			d[v]--;
			if(!d[v]) q.push(v);
		}
	}
	for(int i=1;i<=n;i++)
		for(int j=i;j<=n;j++){
			vc[id[i][j]]=(node){dp[id[i][j]],dis[i][j],i,j};
			//cerr<<i<<' '<<j<<' '<<dp[id[i][j]]<<' '<<dist2(i,j)<<'\n';
		}
	sort(vc+1,vc+tot+1);
	mx[1]=vc[1];
	for(int i=2;i<=tot;i++)
		mx[i]=max(mx[i-1],vc[i]);
	for(int i=1;i<=t;i++)
		cin>>qr[i].first,qr[i].second=i;
	sort(qr+1,qr+t+1);
	int p=0;
	for(int i=1;i<=t;i++){
		while(p<tot&&vc[p+1].lim<=qr[i].first) p++;
		ans[qr[i].second]=make_pair(mx[p].u,mx[p].v);
	}
	for(int i=1;i<=t;i++) 
		cout<<ans[i].first<<' '<<ans[i].second<<'\n';
	return 0;
}

回复

4 条回复,欢迎继续交流。

正在加载回复...