ARC172D Distance Ranking

Description

nn 维空间中的点,每个点的坐标都是整数。给定 (n1)n2 个点对距离的大小关系,构造一个满足条件的解。答案中整数坐标 108,3n20

Solution

超,2936!

根据 n=3 的 “把三个点放到一个线段上” 的做法行不通就应该能猜到 n 个点必须用 n 维而不是 n1 或者 n2 维(也就是你把三个点放到三角形中考虑)

不过现在是 n 个点 n 个维度,所以令坐标矩阵 p 满足 pi,j=[i=j] 就能满足所有点之间的距离都相等(2

既然这样,我们试图给将这些点进行 微扰,具体而言,将原先坐标矩阵 [1 0 00 1 00 0 1] 变成 [1+ϵ1,1 0+ϵ1,2 0+ϵ1,30+ϵ2,1 1+ϵ2,2 0+ϵ2,30+ϵ3,1 0+ϵ3,2 1+ϵ3,3]

这里 ϵi,j 是非常小的量,比如 105 级别,我们通过将它们同时乘 108 而变成整数,同时调整他们的相对大小来实现距离的偏序关系。

直接写出来点之间距离表达式,注意到比较距离大小(比如 d(pi,pj)d(pk,pl)),本质上就是比较 ϵi,j+ϵj,iϵk,l+ϵk,l 的大小(这里我们省略了两个 ϵ 相乘的项,因为 nϵ 相加仍然和 1 有很大差距)

假设 i<j 一种直截了当的方法就是让 pj,i=0,pi,j=ranki,j(i,j) 对子在点对距离中的排名

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;
}
posted @   没学完四大礼包不改名  阅读(48)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示