[POI2018]Plan metra 乱搞

Description
有一棵n个点的无根树,每条边有一个正整数权值,表示长度,定义两点距离为在树上的最短路径的长度。
已知2到n-1每个点在树上与1和n的距离,请根据这些信息还原出这棵树。


Sample Input
7
6 6 2 2 1
5 3 5 1 4


Sample Output
TAK
1 5 2
5 7 1
5 2 4
7 3 3
1 4 2
1 6 1


你选一个最短的x+y的值,然后把这条链选出来,不断在这条链上插点。
特殊情况有点多,可以看我的代码。。。


#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
typedef long long LL;
int _min(int x, int y) {return x < y ? x : y;}
int _max(int x, int y) {return x > y ? x : y;}
int read() {
	int s = 0, f = 1; char ch = getchar();
	while(ch < '0' || ch > '9') {if(ch == '-') f = -1; ch = getchar();}
	while(ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch = getchar();
	return s * f;
}
void put(int x) {
	if(x == 0) {putchar('0'); putchar(' '); return ;}
	char num[10]; int len = 0;
	while(x) num[++len] = x % 10 + '0', x /= 10;
	for(int i = len; i; i--) putchar(num[i]);
	putchar(' ');
}

struct node {
	int x, y, id, pos;
} a[510000];
struct edge {
	int x, y, c;
} e[510000]; int o;
int tp, sta[510000], gg[510000];

bool cmp(node a, node b) {return a.x < b.x;}
bool cmp1(node a, node b) {return a.x - a.pos < b.x - b.pos;}

int main() {
	int n = read();
	if(n == 2) {
		puts("TAK");
		puts("1 2 3");
		return 0;
	}
	for(int i = 2; i < n; i++) a[i].x = read();
	for(int i = 2; i < n; i++) a[i].y = read(), a[i].id = i;
	if(a[2].x != a[2].y) {
		int val = abs(a[2].x - a[2].y), i = 3;
		for(i = 3; i < n; i++) {
			if(abs(a[i].x - a[i].y) != val) break;
		} if(i == n) {
			puts("TAK");
			printf("1 %d %d\n", n, val);
			for(int i = 2; i < n; i++) {
				if(a[i].x < a[i].y) printf("1 %d %d\n", i, a[i].x);
				else printf("%d %d %d\n", i, n, a[i].y);
			} return 0;
		}
	}
	sort(a + 2, a + n, cmp);
	int minn = 0x3f3f3f3f;
	for(int i = 2; i < n; i++) minn = _min(minn, a[i].x + a[i].y);
	sta[tp = 1] = 1; a[n].x = minn; gg[1] = 0;
	for(int i = 2; i < n; i++) if(a[i].x + a[i].y == minn) sta[++tp] = a[i].id, gg[tp] = a[i].x;
	sta[++tp] = n; gg[tp] = minn;
	for(int i = 2; i <= tp; i++) {
		if(gg[i] == gg[i - 1]) {puts("NIE"); return 0;}
		e[++o].x = sta[i - 1], e[o].y = sta[i], e[o].c = gg[i] - gg[i - 1];
	}
	for(int i = 2; i < n; i++) {
		if(a[i].x + a[i].y != minn) {
			a[i].pos = (a[i].x + a[i].y - minn);
			if(a[i].pos % 2) {puts("NIE"); return 0;}
			a[i].pos /= 2;
		}
	} sort(a + 2, a + n, cmp1);
	int gt = 0;
	for(int i = 2; i < n; i++) {
		if(a[i].x + a[i].y != minn) {
			while(gt < tp && a[i].x - a[i].pos >= gg[gt + 1]) gt++;
			if(a[i].x - a[i].pos != gg[gt]) {puts("NIE"); return 0;}
			e[++o].x = sta[gt], e[o].y = a[i].id; e[o].c = a[i].pos;
		}
	} if(o != n - 1) {puts("NIE"); return 0;}
	puts("TAK");
	for(int i = 1; i <= o; i++) put(e[i].x), put(e[i].y), put(e[i].c), puts("");
	return 0;
}

2018年的POI数据是指在这一年收集和整理的地理位置信息。POI即“兴趣点”,主要指代人们感兴趣的地点或目的地,如商场、餐馆、银行、旅游景点等。这些地理位置信息对于许多业务和服务提供者非常重要。 2018年的POI数据主要来源于多方渠道的收集,包括地图服务提供商、手机应用、社交媒体等。这些数据通常包括地点的名称、地址、经纬度坐标和其他相关信息,如电话号码、营业时间、评分等。通过这些数据,人们可以快速找到他们感兴趣的地点,并获取所需的信息。 2018年的POI数据的应用非常广泛。许多在线地图和导航应用使用这些数据为用户提供准确的路线图和导航服务。此外,许多电子商务和外卖平台也将POI数据用于定位商家和生成配送路线。旅游业也可以利用这些数据为游客提供详细的旅游信息。此外,政府和城市规划机构也可以使用POI数据来评估城市的交通流量、商业发展和社区服务覆盖情况。 然而,2018年的POI数据也存在一些问题。由于数据的来源多样性,数据的准确性和完整性可能有所差异。同时,对于一些新开业的地点或不常见的地方,可能存在信息不全的情况。因此,在使用POI数据时,用户需要谨慎处理,并与其他数据进行交叉验证。 总而言之,2018年的POI数据对于许多行业和个人来说是非常宝贵的。它们帮助人们快速找到所需的地点,并提供了丰富的信息。然而,在使用POI数据时,仍需谨慎处理,以确保数据的准确性和适用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值