社区讨论
只 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 条回复,欢迎继续交流。
正在加载回复...