Processing math: 100%

[atARC103F]Distance Sums

给定n个数di,构造一棵n个点的树使得1in,nj=1dist(i,j)=di

其中dist(i,j)表示ij的路径上所经过的边数,若无解输出-1

2n1051di1012,保证di各不相同

复制代码
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define N 100005
 4 #define pli pair<long long,int>
 5 #define fi first
 6 #define se second
 7 vector<pli>e;
 8 int n,sz[N];
 9 pli d[N];
10 int main(){
11     scanf("%d",&n);
12     for(int i=1;i<=n;i++){
13         scanf("%lld",&d[i].fi);
14         d[i].se=i;
15     }
16     sort(d+1,d+n+1);
17     for(int i=1;i<=n;i++)sz[i]=1;
18     for(int i=n;i>1;i--){
19         int fa=lower_bound(d+1,d+i+1,make_pair(d[i].fi+(2*sz[i]-n),0))-d;
20         if (d[fa].fi!=d[i].fi+(2*sz[i]-n)){
21             printf("-1");
22             return 0;
23         }
24         sz[fa]+=sz[i];
25         e.push_back(make_pair(d[fa].se,d[i].se));
26     }
27     for(int i=2;i<=n;i++)d[1].fi-=sz[i];
28     if (d[1].fi)printf("-1");
29     else
30         for(int i=0;i<n-1;i++)printf("%d %d\n",e[i].fi,e[i].se);
31 }
View Code
复制代码

 

posted @   PYWBKTDA  阅读(107)  评论(0编辑  收藏  举报
编辑推荐:
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
阅读排行:
· C# 13 中的新增功能实操
· Ollama本地部署大模型总结
· 2025成都.NET开发者Connect圆满结束
· langchain0.3教程:从0到1打造一个智能聊天机器人
· 用一种新的分类方法梳理设计模式的脉络
历史上的今天:
2019-11-10 [bzoj2330]糖果
2019-11-10 [bzoj1877]晨跑
2019-11-10 [bzoj1834]网络扩容
2019-11-10 [bzoj1934]善意的投票
2019-11-10 [bzoj3038]上帝造题的7分钟2
点击右上角即可分享
微信分享提示