[尊老爱幼] Queen
You are given a rooted tree with vertices numerated from 1 to n
. A tree is a connected graph without cycles. A rooted tree has a special vertex named root.
Ancestors of the vertex i
are all vertices on the path from the root to the vertex i, except the vertex i itself. The parent of the vertex i is the nearest to the vertex i ancestor of i. Each vertex is a child of its parent. In the given tree the parent of the vertex i is the vertex pi. For the root, the value pi is −1
.
An example of a tree with n=8
, the root is vertex 5. The parent of the vertex 2 is vertex 3, the parent of the vertex 1 is vertex 5. The ancestors of the vertex 6 are vertices 4 and 5, the ancestors of the vertex 7 are vertices 8, 3 and 5
You noticed that some vertices do not respect others. In particular, if ci=1
, then the vertex i does not respect any of its ancestors, and if ci=0
, it respects all of them.
You decided to delete vertices from the tree one by one. On each step you select such a non-root vertex that it does not respect its parent and none of its children respects it. If there are several such vertices, you select the one with the smallest number. When you delete this vertex v
, all children of v become connected with the parent of v
.
An example of deletion of the vertex 7
Once there are no vertices matching the criteria for deletion, you stop the process. Print the order in which you will delete the vertices. Note that this order is unique.
Input
The first line contains a single integer n
(1≤n≤105
) — the number of vertices in the tree.
The next n
lines describe the tree: the i-th line contains two integers pi and ci (1≤pi≤n, 0≤ci≤1), where pi is the parent of the vertex i, and ci=0, if the vertex i respects its parents, and ci=1, if the vertex i does not respect any of its parents. The root of the tree has −1 instead of the parent index, also, ci=0 for the root. It is guaranteed that the values pi define a rooted tree with n
vertices.
Output
In case there is at least one vertex to delete, print the only line containing the indices of the vertices you will delete in the order you delete them. Otherwise print a single integer −1
.
Examples
5
3 1
1 1
-1 0
2 1
3 0
1 2 4
5
-1 0
1 1
1 1
2 0
3 0
-1
8
2 1
-1 0
1 0
1 1
1 1
4 0
5 1
7 0
5
Note
The deletion process in the first example is as follows (see the picture below, the vertices with ci=1
are in yellow):
- first you will delete the vertex 1
, because it does not respect ancestors and all its children (the vertex 2) do not respect it, and 1
- is the smallest index among such vertices;
- the vertex 2
will be connected with the vertex 3
- after deletion;
- then you will delete the vertex 2
, because it does not respect ancestors and all its children (the only vertex 4
- ) do not respect it;
- the vertex 4
will be connected with the vertex 3
- ;
- then you will delete the vertex 4
- , because it does not respect ancestors and all its children (there are none) do not respect it (vacuous truth);
- you will just delete the vertex 4
- ;
- there are no more vertices to delete.
In the second example you don't need to delete any vertex:
- vertices 2
and 3
- have children that respect them;
- vertices 4
and 5
- respect ancestors.
In the third example the tree will change this way:
题意:输入一个n,接下来n行,每行2个数pi表示第i个结点的父结点,ci为1表示这个结点不尊重他的祖先,为0表示它尊重祖先
对于一个非根结点,如果它不尊重祖先且其孩子不尊重它,则它被删掉且它的孩子连到它的父结点上,输出被删去的结点编号
思路:一开始想如果一个结点被删除就等价于它被它的孩子结点代替,所以如果删除一个结点后就打上删除标记,访问一个被删去的结点时就去访问它的儿子碰到儿子时被删除的结点就递归地访问直到没有一个结点是要被删除的
这样dfs模拟,但这样在test10超时了.其实如果一个结点不尊重祖先,但它的孩子尊重它,则他是不能删的,所以对于一个不尊重祖先但被孩子尊重的结点从它的父结点开始连续的不尊重祖先的结点都是需要删掉的,
所以我们先把不尊重祖先的结点标记,再标记出不尊重祖先但被孩子尊重的结点,最后输出不尊重祖先且不被孩子尊重的结点
注意这里是先标记了不尊重祖先的结点,才看那些是不尊重祖先但被孩子尊重的结点,如果在标记不尊重祖先的结点的同时看那些结点被孩子标记,可能会出现现在这个结点的孩子没被标记为不尊重祖先的结点,但后面的输入是被标记了,这样就错误的把当前这个结点标记为不尊重祖先但被孩子尊重的结点
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
typedef long long ll;
const int amn=1e5+;
int n,ans[amn],p[amn],c[amn],root;
int main(){
int need[amn];
memset(need,,sizeof need);
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d%d",&p[i],&c[i]);
if(p[i]==-)root=i;
if(c[i])need[i]=;
}
for(int i=;i<=n;i++){
if(!c[i])need[p[i]]=;
}
int tp=;
for(int i=;i<=n;i++){
if(!need[i]||i==root)continue;
if(c[i]&&need[i])
ans[++tp]=i;
}
if(tp){
for(int i=;i<=tp;i++)printf("%d%c",ans[i],i<tp?' ':'\n');
}
else printf("-1\n");
}
/**
题意:输入一个n,接下来n行,每行2个数pi表示第i个结点的父结点,ci为1表示这个结点不尊重他的祖先,为0表示它尊重祖先
对于一个非根结点,如果它不尊重祖先且其孩子不尊重它,则它被删掉且它的孩子连到它的父结点上,输出被删去的结点编号
思路:一开始想如果一个结点被删除就等价于它被它的孩子结点代替,所以如果删除一个结点后就打上删除标记,访问一个被删去的结点时就去访问它的儿子碰到儿子时被删除的结点就递归地访问直到没有一个结点是要被删除的
这样dfs模拟,但这样在test10超时了.其实如果一个结点不尊重祖先,但它的孩子尊重它,则他是不能删的,所以对于一个不尊重祖先但被孩子尊重的结点从它的父结点开始连续的不尊重祖先的结点都是需要删掉的,
所以我们先把不尊重祖先的结点标记,再标记出不尊重祖先但被孩子尊重的结点,最后输出不尊重祖先且不被孩子尊重的结点
注意这里是先标记了不尊重祖先的结点,才看那些是不尊重祖先但被孩子尊重的结点,如果在标记不尊重祖先的结点的同时看那些结点被孩子标记,可能会出现现在这个结点的孩子没被标记为不尊重祖先的结点,但后面的输入是被标记了,这样就错误的把当前这个结点标记为不尊重祖先但被孩子尊重的结点
**/
[尊老爱幼] Queen的更多相关文章
- ACM: Long Live the Queen - 树上的DP
Long Live the Queen Time Limit:250MS Memory Limit:4096KB 64bit IO Format:%I64d & %I64u D ...
- 皇后(queen)
皇后(queen)[题目描述] 众所不知,rly现在不会玩国际象棋.但是,作为一个OIer,rly当然做过八皇后问题.这里再啰嗦几句,皇后可以攻击到同行同列同对角线,在n*n的方格中摆n个皇后使其互不 ...
- 1976 Queen数列
1976 Queen数列 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 将1到N的整数数列(1 ...
- Uva 11538 - Chess Queen
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- 组合数学 UVa 11538 Chess Queen
Problem A Chess Queen Input: Standard Input Output: Standard Output You probably know how the game o ...
- uva 10401 Injured Queen Problem(dp)
题目链接:10401 - Injured Queen Problem 题目大意:给出一个字符串,要求在n * n(n为字符串的长度)的棋盘上摆放n个受伤的皇后,受伤的皇后只能攻击到同一列和它周围8个格 ...
- C. Queen Codeforces Round #549 (Div. 2) dfs
C. Queen time limit per test 1 second memory limit per test 256 megabytes input standard input outpu ...
- 高可用OpenStack(Queen版)集群-1. 集群环境
参考文档: Install-guide:https://docs.openstack.org/install-guide/ OpenStack High Availability Guide:http ...
- 143. Long Live the Queen 树形dp 难度:0
143. Long Live the Queen time limit per test: 0.25 sec. memory limit per test: 4096 KB The Queen of ...
随机推荐
- AndroidStudio自动导入包
IntelliJ IDEA可以自动优化导入包,但是有多个同名的类位于不同的包时,需要自己手动使用Alt + Enter进行导入. Settings→Editor→General→Auto Import ...
- SYC极客大挑战部分题目writeup
Welcome 复制黏贴flag即可 我相信你正在与我相遇的路上马不停蹄 关注微信工作号回复"我要flag"即可获得flag 代号为geek的行动第一幕:毒雾初现 发现flag为摩 ...
- PHP 解决对文件操作的高并发问题
解决方案: 对文件进行加锁时,设置一个超时时间.超时设置为1ms,如果这段时间内没有获得锁,就反复获得,直到获得对文件的操作权为止.如果超市限制已到,就必须马上退出,让出锁让其他进程进行操作. ...
- CountDownLatch源码探究 (JDK 1.8)
CountDownLatch能够实现让线程等待某个计数器倒数到零的功能,之前对它的了解也仅仅是简单的使用,对于其内部如何实现线程等待却不是很了解,最好的办法就是通过看源码来了解底层的实现细节.Coun ...
- 修改gridfilters.js源码,往后台多传递一个参数,并设置NumericFilter、StringFilter默认提示信息
创作不易,转载请注明出处!!! 效果 修改:ext-extend.js源码 在最后面添加3行,重写方法 代码拷贝区 Ext.override(Ext.ux.grid.GridFilters, { me ...
- 生产要不要开启MySQL查询缓存
一.前言 在当今的各种系统中,缓存是对系统性能优化的重要手段.MySQL Query Cache(MySQL查询缓存)在MySQL Server中是默认打开的,但是网上各种资料以及有经验的DBA都建议 ...
- 搭建flutter开发
最近入坑flutter,dart还没开始学,搭环境就干了我一天半,不容易,记录一下, 我们先立个目标,这是我已经配好的,我是真的有强迫症,需要打四个对勾,真的不容易,我们一个一先说一下每一个都代表什么 ...
- vue相关坑
1:vue 动态加载图片路径报错解决方法,循环遍历图片不显示图片 解决方法:https://www.cnblogs.com/qingcui277/p/8930507.html
- 基于springcloud框架搭建项目-Eureka篇(一)
springcloud项目近年来算是很流行的了,不少公司项目目前都用到了,毕竟优点很多,刚好公司项目用到了,根据自己的理解,简单搭建一下,以便以后学习 这里简单的介绍一下它: SpringCloud, ...
- plist 图集 php 批量提取 PS 一个个切
最近,迷上了用 cocos2d 做游戏开发.由于是新入门,很多东西从头开始学. 在使用 sprite 的 Rect 裁剪显示的时候,显示总是多一块.所以,要从图集中提取一张张图,这样就省了裁剪. 原图 ...