ARC172D Distance Ranking
Description
个 维空间中的点,每个点的坐标都是整数。给定 个点对距离的大小关系,构造一个满足条件的解。答案中整数坐标
Solution
超,2936!
根据 的 “把三个点放到一个线段上” 的做法行不通就应该能猜到 个点必须用 维而不是 或者 维(也就是你把三个点放到三角形中考虑)
不过现在是 个点 个维度,所以令坐标矩阵 满足 就能满足所有点之间的距离都相等()
既然这样,我们试图给将这些点进行 微扰,具体而言,将原先坐标矩阵 变成
这里 是非常小的量,比如 级别,我们通过将它们同时乘 而变成整数,同时调整他们的相对大小来实现距离的偏序关系。
直接写出来点之间距离表达式,注意到比较距离大小(比如 和 ),本质上就是比较 和 的大小(这里我们省略了两个 相乘的项,因为 个 相加仍然和 有很大差距)
假设 一种直截了当的方法就是让 即 对子在点对距离中的排名
Code
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
template<typename T>inline void ckmax(T &x,T y){x=x<y?y:x;}
template<typename T>inline void ckmin(T &x,T y){x=x>y?y:x;}
template<typename T=int>inline T read(){
T res=0,f=1; char k;
while(!isdigit(k=getchar())) if(k=='-') f=-1;
while(isdigit(k)) res=res*10+k-'0',k=getchar();
return res*f;
}
template<typename T>inline void print(T x,bool fl=1){
if(x<0) putchar('-'),x=-x;
if(x>=10) print(x/10,0);
putchar(x%10+'0');
if(fl) putchar('\n');
}
int main(){
int n=read();
vector<vector<int> >ans(n,vector<int>(n));
for(int i=1;i<=n*(n-1)/2;++i){
int a=read(),b=read();
if(a>b) swap(a,b);
--a; --b;
ans[a][b]=n*(n-1)/2-i+1;
}
rep(i,0,n-1) ans[i][i]=1e8;
rep(i,0,n-1){
rep(j,0,n-1) printf("%d ",ans[i][j]);
putchar('\n');
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律