CodeForces - 681D Gifts by the List(思维)
题目链接:点击查看
题目大意:给出一个 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(思维)相关推荐
- Codeforces Round #459 (Div. 2) C 思维,贪心 D 记忆化dp
Codeforces Round #459 (Div. 2) C. The Monster 题意:定义正确的括号串,是能够全部匹配的左右括号串. 给出一个字符串,有 (.). ? 三种字符, ? 可以 ...
- codeforces 148 C. Terse princess(思维,构造)
C. Terse princess(思维,构造) 题目链接:codeforces 148C 题意: 有个公主找王子,如果这个人比之前所有王子的财富都高,公主就会Oh, ...
- CodeForces - 1498D Bananas in a Microwave(思维+dp)
题目链接:点击查看 题目大意:给出 nnn 次操作,初始时有一个 k=0k=0k=0,每次操作抽象为三个数 txyt\ x\ yt x y,其中 xxx 可能为小数,可以选择一个 num∈[0,y]n ...
- CodeForces - 813E Army Creation(主席树+思维)
题目链接:点击查看 题目大意:给出一个长度为 nnn 的数列和一个整数 kkk,现在有 qqq 次询问,每次询问给出一个区间 [l,r][l,r][l,r],设 cnticnt_icnti 为数字 ...
- CodeForces - 1030C Vasya and Golden Ticket(思维)
题目链接:点击查看 题目大意:给定长度为n的字符串,字符串全部由0~9的数字组成,要求将字符串划分为连续的子字符串,要求每个子字符串的和都要相等,问给定字符串能否成功划分 题目分析:简单思维,因为划分 ...
- CodeForces - 1245A Good ol' Numbers Coloring (思维)
Codeforces Round #597 (Div. 2 Consider the set of all nonnegative integers: 0,1,2,-. Given two integ ...
- 【CodeForces - 298C】Parity Game (思维,有坑)
题干: You are fishing with polar bears Alice and Bob. While waiting for the fish to bite, the polar be ...
- Codeforces Round #533 (Div. 2) C.思维dp D. 多源BFS
题目链接:https://codeforces.com/contest/1105 C. Ayoub and Lost Array 题目大意:一个长度为n的数组,数组的元素都在[L,R]之间,并且数组全 ...
- Codeforces 893 D Credit Card 贪心 思维
题目链接: http://codeforces.com/contest/893/problem/D 题目描述: 每天晚上一个数值a,如果a>0表示今天收入a元,<0表示亏损a元,=0表示去 ...
最新文章
- Nat. Mach. Intell. | 基于神经网络的迁移学习用于单细胞RNA-seq分析中的聚类和细胞类型分类...
- Meta分析到底该怎么选题?
- Golang源码探索(一) 编译和调试源码
- java 初级编程题_java基础经典编程题
- underscorejs-groupBy学习
- 浅释一下,为什么要使用接口?
- UPS改造及终端流量监控系统
- object-C控制语句
- idea 添加servlet依赖_详解如何使用IntelliJ IDEA新建一个Servlet项目
- Keyphrase Extraction 一个快速从中文里抽取关键短语的工具
- 论文A Tutorial on Graph-Based SLAM 学习笔记
- multisim中pwl_(Multisim电子电路仿真教程)第3章Multisim仿真元件库与虚拟仪器.ppt
- 基于模型驱动低代码平台的实现原理
- LR破解版录制手机脚本
- Vue表单设计器的终极解决方案
- 关于NBIoT的知识
- vue延迟渲染组件_性能优化之组件懒加载: Vue Lazy Component 介绍
- 如何看电脑内存型号?
- Vue实现超级简单的tab切换
- 利用物联网全方位节能,降费增效明显
热门文章
- Spring反转控制
- Java领域的对象如何传输-了解序列化的意义
- 为什么我们要学习Java虚拟机?
- AOP日志-后置通知
- jQuery对象和DOM对象互转的问题、jQuery文件引入问题、DOM版本的网页开关灯
- win7电脑总是提示重新启动计算机以完成重要更新的安装是怎么回事,Win7开机时弹出Windows Update提示,怎样解决?(图文)...
- spring-others
- Shell文件的排序、合并和分割
- 上线清单 —— 20 个 Laravel 应用性能优化项
- centos7全离线安装docker1.17.12