构造思维D. Weights Assignment For Tree Edges

Posted 行码棋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了构造思维D. Weights Assignment For Tree Edges相关的知识,希望对你有一定的参考价值。

题目链接:
https://codeforces.com/problemset/problem/1611/D

n个节点
第一行n个数表示b[i]i 的父节点
第二行n个数表示p[i] 到根节点的距离是 第 i 小的
要按给的排名给边进行赋值,求出所有的边权


定义d[i]数组表示 i节点到根节点的距离

  • 构造距离
    p[i]到根节的距离是第i小,则构造p[i]到根节点的距离为前一个比它小的距离加一
    d[p[i]] = d[p[i-1]]+1

  • 不满足情况

    • 根节点祖先节点不等于根节点
    • 距离是从小到大进行计算的,当前节点到根节点的距离等于前一个比它小的节点到根节点的距离加1。当然如果祖先节点到根节点的距离没有提前被计算出来,肯定无法得出祖先节点到当前节点的边权值,所以此种情况要考虑一下。
  • 输出
    ib[i]的距离可以通过 d [ i ] − d [ b [ i ] ] d[i] - d[b[i]] d[i]d[b[i]]求出,即到根节点的距离减去祖先节点到根节点的距离

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5+5;

void solve()

	int n;
	cin>>n;
	vector<int>b(n+1),p(n+1),d(n+1,-1);
	
	for(int i=1;i<=n;i++) cin>>b[i];
	for(int i=1;i<=n;i++) cin>>p[i];
	
	if(b[p[1]] != p[1]) 
	
		cout<<-1<<endl;
		return ;
	 
	
	d[p[1]] = 0;
	for(int i=2;i<=n;i++)
	
		if(d[b[p[i]]] == -1)
		
			cout<<-1<<endl;
			return;
		
		d[p[i]] = d[p[i-1]] + 1;
	
	
	for(int i=1;i<=n;i++)
		cout<<d[i]-d[b[i]]<<" \\n"[i==n];


int main()

	int t;
//	t = 1;
	cin>>t;
	while(t--) solve();
	return 0;
  

以上是关于构造思维D. Weights Assignment For Tree Edges的主要内容,如果未能解决你的问题,请参考以下文章

D. Weights Assignment For Tree Edges(11.27)

D. Anti-Sudoku1300 / 思维 构造

D. Game With Array1400 / 思维 构造

Codeforces Round #704 (Div. 2) D. Genius‘s Gambit(构造+思维)

ACM-ICPC 2018 青岛赛区现场赛 D. Magic Multiplication && ZOJ 4061 (思维+构造)

D. Pair of Topics1400 / 思维 二分