猴子

题目描述

有 N 只猴子,第一只尾巴挂在树上,剩下的 N-1 只,要么被其他的猴子抓住,要么抓住了其他的猴子,要么两者均有。当然一只猴子最多抓两只另外的猴子,只有两只手嘛。现在给出这N只猴子抓与被抓的信息。

在某个时刻某只猴子 A 会放掉它左手或右手的猴子 B ,会出现以下三种情况:
1.B 起初并没有抓住 A,则 B 会掉下;
2.B 起初也抓住了 A,但在 A 放手的同时 B 并没有放手,则 B 不会掉下;
3.B 起初也抓住了 A,在 A 放手的同时 B 也放手了,则 B 会掉下。

如果 B 掉下,就会同时导致相关猴子也落到地上。求每只猴子的落地的时间。

输入格式

第一行两个数 N、M,表示有 N 只猴子,并且总时间为 M-1 。

接下来 N 行,按编号从 1..N 描述了每只猴子的信息,每行两个整数,第 i 行的两个数分别表示第 i 只猴子的左手和右手抓的猴子的编号,如果是 -1 ,表示该猴子那只手没抓其他的猴子。再接下来 M 行,按时间顺序(0~M-1)给出了一些猴子放手的信息,第 1+N+i 行表示第 i-1 时刻某只猴子的放手信息,信息以两个数给出,前者表示放手的猴子的编号,后者表示其放的是哪只手,1 左 2 右。

输出格式

共输出 N 行,第 i 行表示第 i 只猴子掉落的时刻,若第 i 只猴子到 M-1 时刻以后还没掉落,就输出 -1 。

样例数据 1

输入

3 2 
-1 3 
3 -1 
1 2 
1 2 
3 1

输出

-1 

1

备注

【数据范围】
30% 的数据,N≤1000;M≤1000;
100% 的数据,1≤N≤200000;1≤M≤400000。

解题报告:

可以把每个猴子看成图中的一个点,猴子之间的关系用无向边来表示,判断一只猴子是否掉落就看其与 1 是否在同一个连通分量中。顺着思考问题可能有点困难,可以反过来思考,首先可以求出第 M-1 时刻之后猴子们的情况,然后倒着来,将猴子一只只“接”上去,这样问题就变成一只猴子最早在什么时候和 1 所处的连通块并在了一起。对于连通性的维护可以用并查集来实现。

时间效率:
我们用并查集来实现连通性的维护,总的时间效率为O(n*α),其中α为不超过5的数,可以视为常数。

空间效率: 0(N+M)。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
int n,m,cnt,hand[200001][2],ret[400001],t[400001][2],graph[400001],time[400001][2];
bool sign[400001];
struct node{int tvtx,last;
}arc[2000001];
inline int readint()
{int i=0,f=1;char ch;for(ch=getchar();(ch<'0'||ch>'9') && ch!='-';ch=getchar());if(ch=='-'){f=-1; ch=getchar();}for(;ch>='0' && ch<='9';ch=getchar())i=(i<<3)+(i<<1)+ch-'0';return i*f;
}
inline void add(int a,int b)
{arc[++cnt].tvtx=b;arc[cnt].last=graph[a];graph[a]=cnt;
}
inline void dfs(int x,int t)
{sign[x]=1;ret[x]=t;for(int i=graph[x];i;i=arc[i].last){int v=arc[i].tvtx;if(!sign[v]) dfs(v,t);}
}
int main()
{register int i,j,a,b;n=readint();m=readint();for(i=1;i<=n;++i) hand[i][0]=readint(),hand[i][1]=readint();memset(time,-1,sizeof(time));for(i=1;i<=n;++i) ret[i]=-2;for(i=0;i<m;++i){t[i][0]=readint();t[i][1]=readint();time[t[i][0]][t[i][1]-1]=i;t[i][1]=hand[t[i][0]][t[i][1]-1];}for(i=1;i<=n;++i)for(j=0;j<=1;++j)if(hand[i][j]!=-1&&time[i][j]==-1){add(i,hand[i][j]);add(hand[i][j],i);}dfs(1,-1);for(i=m-1;i>=0;--i){a=t[i][0];b=t[i][1];add(a,b);add(b,a);if(sign[a]&&!sign[b]) dfs(b,i);if(sign[b]&&!sign[a]) dfs(a,i);}for(i=1;i<=n;++i) printf("%d\n",ret[i]);
}

C++——NOIP模拟题——猴子相关推荐

  1. 闵梓轩大佬のnoip模拟题D1 总结 2017/10/26

    背景 题目概括 T1 题面 分析 90分算法 满分算法 T2 题面 分析 部分分算法 满分算法 满分代码 T3 题面 分析 代码 总结 背景 这道题目是去年的金牌大佬闵梓轩在一年前出的一套noip模拟 ...

  2. NOIp模拟题 之 肮脏的牧师 (桶排序)

    闲话: 考场上看到了这一题,简直令我震惊!啊!居然还有真么简单的模拟题!良心啊! 而且,还是我 痴迷的 熟悉的游戏 --  欧气传说 炉石传说! (话说题面的那三张卡都贼 恶心 好用!都可以在前期打出 ...

  3. 一些noip模拟题一句话题解

    Problem A: 序列 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 12  Solved: 9 [Submit][Status][Web Bo ...

  4. 【noip模拟题】天神下凡(贪心)

    vijos某次模拟赛原题... 处理出每个圆的一级祖先就行了... 其实没有那么麻烦,贪心即可出解. 我们将每个圆转换成线段后按左端点小右端点大的方法排序 然后维护一个栈: 对于每一个圆i 如果栈顶右 ...

  5. NOIP模拟题——来自风平浪静的明天

    [题目描述] 冬眠了五年,光终于从梦中醒来. 千咲.要,大家都在. 隐约记得"昨天"的海船祭,爱花意外成为贡女,沉入海底. 海面冰封,却有丝丝暖流在冰面之下涌动. 此时,爱花沉睡在 ...

  6. Noip模拟题解题报告

    Pro 第一次AK. 题目链接 Sol 站军姿 算是数学题吧,求出两圆的位置关系,然后余弦定理和扇形面积什么的搞搞就行. #include<iostream> #include<cs ...

  7. noip模拟题11.5

    T1 大天使之剑 [问题描述] 小A在游戏⾥打怪.有⼀次,他⼀下⼦遇到了n个怪物. 每个怪物有一个生命值,第i个怪物的生命值是h_i.而小A除了生命值之外,还有一个属性是魔法值m. 小A和怪物们依次行 ...

  8. noip模拟题11.11 光棍节测试

    T1. tractor 题目描述 农场上有N(1 <= N <= 50,000)堆草,放在不同的地点上.FJ有一辆拖拉机,也在农场上.拖拉机和草堆都表示为二维平面上的整数坐标,坐标值在1. ...

  9. [Noip模拟题]寿司

    Description 小 c 是一名 oier.最近,他发现他的数据结构好像学傻了.因为他在刷题时碰到了一道傻逼数据结构题,强行使用了平衡树来解决,卡着时间 AC.为此,他被狠狠地嘲讽了一番.于是, ...

最新文章

  1. HibernateDaoSupport的使用
  2. [置顶]IA32 architecture 学习笔记 (一)
  3. android sqlite SQLiteDatabase 操作大全 不看后悔!必收藏!看后精通SQLITE (第二部分)...
  4. python编程基础怎么学英语_英语不行而且从没碰过编程,如何0基础学python?
  5. Python字符串格式:%vs.format
  6. java学习(5):全局变量和局部变量
  7. 对于elemnet-ui的el-upload的使用总结(移除上传文件判断,action等问题)
  8. 第一财经周刊:硅谷就是这样
  9. netapp管理地址_NETAPP存储系统管理员手册.doc
  10. 用spark中DataFrame对数据进行去重、缺失值处理、异常值处理
  11. persevere的用法_persevere和persist和insist的区别是什么?
  12. JDK1.6支持TSL1.2协议
  13. learn the python in hard way习题36~39的附加习题
  14. udpsender用法
  15. 利用计算机画统计图.doc,信息技术应用利用计算机画统计图.pptx
  16. REUSE_ALV_GRID_DISPLAY_LVC 实现单元格值改变前(DATA_CHANGED)和单元格值改变后(DATA_CHANGED_FINISHED)的事件响应
  17. GEC6818 移植 rtl8723bu wifi驱动
  18. 优漫动游平面设计思维思维训练法
  19. 考前集训 Day1下午
  20. GLSurfaceView

热门文章

  1. 设计核酸检测数据库系统
  2. 基于ssh大学生党建网站系统
  3. 直流信号线性放大器非隔离转换模块0-10V转0-12V大功率负载180mA导轨安装
  4. 区块链内的十大强强联手
  5. 监控员工电脑的软件要钱吗?
  6. 如何使用 js 过滤文本框表情符号
  7. Linux社区:对不起,道歉无用!
  8. css使用三个属性设置文本结尾省略号显示
  9. 给知更鸟主题首页加上日期和问候语
  10. [小北De编程手记] [Lesson 02] AutoFramework构建 之 Page Objects - 设计模式