题目链接:点击查看

题目大意:给出一个 n 个点组成的森林,每条边都是有向边,规定一个点的祖先节点也包括了其本身,现在每个人都想要送给其祖先礼物,已知第 i 个人想要送给祖先 a[ i ] 。

要求构造一个序列称之为 list,现在 n 个人按照顺序从 1 ~ n 开始送礼物,规则就是轮到第 i 个人时,他去 list 里找到第一个自己的祖先然后送出去礼物,问是否存在这样一个序列 list,满足每个 i 都可以送给 a[ i ] 礼物

题目分析:题意有点难明白的一道题,然后明白题意了也可能不会做的一道题。。

直接说结论吧,如果 a -> b -> c -> d 是一个子孙关系,a 是祖先节点,如果 d 给 a 送礼物,那么 b 和 c 一定也要给 a 送礼物

反证法证明一下,如果 c 给 b 送礼物,那么在 list 里 b 一定在 a 的前面,所以 d 就无法给 a 送礼物了

所以得到了一个小结论就是,每个人要么给自己送礼物,要么和父节点送礼物的对象相同才行

这样一来只需要按顺序保存一下祖先节点即可

代码:

//#pragma GCC optimize(2)
//#pragma GCC optimize("Ofast","inline","-ffast-math")
//#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=1e6+100;vector<int>node[N],ans;int du[N],a[N];//入度void dfs(int u)
{for(auto v:node[u]){dfs(v);if(a[v]!=v&&a[u]!=a[v]){puts("-1");exit(0);}}if(a[u]==u)ans.push_back(u);
}int main()
{
#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){int u,v;scanf("%d%d",&u,&v);du[v]++;node[u].push_back(v);}for(int i=1;i<=n;i++)scanf("%d",a+i);for(int i=1;i<=n;i++)if(!du[i])dfs(i);printf("%d\n",ans.size());for(auto it:ans)printf("%d\n",it);return 0;
}

CodeForces - 681D Gifts by the List(思维)相关推荐

  1. Codeforces Round #459 (Div. 2) C 思维,贪心 D 记忆化dp

    Codeforces Round #459 (Div. 2) C. The Monster 题意:定义正确的括号串,是能够全部匹配的左右括号串. 给出一个字符串,有 (.). ? 三种字符, ? 可以 ...

  2. codeforces 148 C. Terse princess(思维,构造)

    C. Terse princess(思维,构造) 题目链接:codeforces 148C 题意:     有个公主找王子,如果这个人比之前所有王子的财富都高,公主就会Oh,              ...

  3. CodeForces - 1498D Bananas in a Microwave(思维+dp)

    题目链接:点击查看 题目大意:给出 nnn 次操作,初始时有一个 k=0k=0k=0,每次操作抽象为三个数 txyt\ x\ yt x y,其中 xxx 可能为小数,可以选择一个 num∈[0,y]n ...

  4. CodeForces - 813E Army Creation(主席树+思维)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的数列和一个整数 kkk,现在有 qqq 次询问,每次询问给出一个区间 [l,r][l,r][l,r],设 cnticnt_icnti​ 为数字 ...

  5. CodeForces - 1030C Vasya and Golden Ticket(思维)

    题目链接:点击查看 题目大意:给定长度为n的字符串,字符串全部由0~9的数字组成,要求将字符串划分为连续的子字符串,要求每个子字符串的和都要相等,问给定字符串能否成功划分 题目分析:简单思维,因为划分 ...

  6. CodeForces - 1245A Good ol' Numbers Coloring (思维)

    Codeforces Round #597 (Div. 2 Consider the set of all nonnegative integers: 0,1,2,-. Given two integ ...

  7. 【CodeForces - 298C】Parity Game (思维,有坑)

    题干: You are fishing with polar bears Alice and Bob. While waiting for the fish to bite, the polar be ...

  8. Codeforces Round #533 (Div. 2) C.思维dp D. 多源BFS

    题目链接:https://codeforces.com/contest/1105 C. Ayoub and Lost Array 题目大意:一个长度为n的数组,数组的元素都在[L,R]之间,并且数组全 ...

  9. Codeforces 893 D Credit Card 贪心 思维

    题目链接: http://codeforces.com/contest/893/problem/D 题目描述: 每天晚上一个数值a,如果a>0表示今天收入a元,<0表示亏损a元,=0表示去 ...

最新文章

  1. Nat. Mach. Intell. | 基于神经网络的迁移学习用于单细胞RNA-seq分析中的聚类和细胞类型分类...
  2. Meta分析到底该怎么选题?
  3. Golang源码探索(一) 编译和调试源码
  4. java 初级编程题_java基础经典编程题
  5. underscorejs-groupBy学习
  6. 浅释一下,为什么要使用接口?
  7. UPS改造及终端流量监控系统
  8. object-C控制语句
  9. idea 添加servlet依赖_详解如何使用IntelliJ IDEA新建一个Servlet项目
  10. Keyphrase Extraction 一个快速从中文里抽取关键短语的工具
  11. 论文A Tutorial on Graph-Based SLAM 学习笔记
  12. multisim中pwl_(Multisim电子电路仿真教程)第3章Multisim仿真元件库与虚拟仪器.ppt
  13. 基于模型驱动低代码平台的实现原理
  14. LR破解版录制手机脚本
  15. Vue表单设计器的终极解决方案
  16. 关于NBIoT的知识
  17. vue延迟渲染组件_性能优化之组件懒加载: Vue Lazy Component 介绍
  18. 如何看电脑内存型号?
  19. Vue实现超级简单的tab切换
  20. 利用物联网全方位节能,降费增效明显

热门文章

  1. Spring反转控制
  2. Java领域的对象如何传输-了解序列化的意义
  3. 为什么我们要学习Java虚拟机?
  4. AOP日志-后置通知
  5. jQuery对象和DOM对象互转的问题、jQuery文件引入问题、DOM版本的网页开关灯
  6. win7电脑总是提示重新启动计算机以完成重要更新的安装是怎么回事,Win7开机时弹出Windows Update提示,怎样解决?(图文)...
  7. spring-others
  8. Shell文件的排序、合并和分割
  9. 上线清单 —— 20 个 Laravel 应用性能优化项
  10. centos7全离线安装docker1.17.12