P1653 猴子

题目描述

有N只猴子,第一只尾巴挂在树上,剩下的N-1只,要么被其他的猴子抓住,要么抓住了其他的猴子,要么两者均有。当然一只猴子最多抓两只另外的猴子。现在给出这N只猴子抓与被抓的信息,并且在某个时刻可能某只猴子会放掉它其中一只手的猴子,导致某些猴子落地。求每只猴子落地的时间。

输入输出格式

输入格式:

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

数据规模

30%的数据,N≤1000,M≤1000;

100%的数据,1≤N≤200000,1≤M≤400000。

输出格式:

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


这个题目很好,有几个方法可以解决。

方法1:各式各样的并查集

这里介绍一种我的写法。

首先,做过差不多此类提醒的题目应该可以意识到我们此时需要倒序连边处理。

剩下的,就是在连接时,当某棵树连接到1节点时,更新这个树所有点的时间。

我使用前向星存父亲对儿子的连边,以遍历这颗树

为了保持树的形态,我使用按秩合并而不是路径压缩。

Code:

#include <cstdio>
#include <cstring>
int max(int x,int y){return x>y?x:y;}
const int N=400010;
int head[N],Next[N],to[N],cnt;
void add(int u,int v)
{
Next[++cnt]=head[u];to[cnt]=v;head[u]=cnt;
}
int ch[N][2],is[N][2],ans[N],f[N],h[N],n,m,q[N][2];
int Find(int x)
{
if(f[x]==x) return x;
return Find(f[x]);
}
void Merge(int x,int y)
{
int rx=Find(x),ry=Find(y);
if(rx==1||(h[rx]>h[ry]&&ry!=1))
{
add(rx,ry);
f[ry]=rx;
h[rx]=max(h[rx],h[ry]+1);
}
else
{
add(ry,rx);
f[rx]=ry;
h[ry]=max(h[ry],h[rx]+1);
}
}
void dfs(int now,int t)
{
if(~ans[now]) return;
ans[now]=t;
for(int i=head[now];i;i=Next[i])
{
int v=to[i];
dfs(v,t);
}
}
int main()
{
memset(ans,-1,sizeof(ans));
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d%d",ch[i],ch[i]+1);
f[i]=i,h[i]=1;
}
for(int i=0;i<m;i++)
{
scanf("%d%d",q[i],q[i]+1);
is[q[i][0]][--q[i][1]]=1;
}
#define u q[i][0]
#define v ch[q[i][0]][q[i][1]]
#define ls ch[i][0]
#define rs ch[i][1]
for(int i=1;i<=n;i++)
{
if(!is[i][0]&&(~ls)&&Find(i)!=Find(ls)) Merge(i,ls);
if(!is[i][1]&&(~rs)&&Find(i)!=Find(rs)) Merge(i,rs);
}
for(int i=m-1;~i;i--)
{
int x=Find(u),y=Find(v);
if(x!=y) Merge(x,y);
if(Find(x)==1&&x!=1) dfs(x,i);
if(Find(y)==1&&y!=1) dfs(y,i);
}
for(int i=1;i<=n;i++) printf("%d\n",ans[i]);
return 0;
}

方法2:神奇的最短路建模

以边消失的时间为权值按原图进行连边,而没断的边置正无穷。

以\(1\)为源点,找到 对某个终点的路径中 所有路径的最小值 中的 **最大值 **

路径的最小值代表这条边的断掉,但只断掉一条边不行,所以我们要找最小值的最大值

有意思的是,拯救小云公主这个题也用到了这个思想,只不过建模更难想。

没写代码


2018.8.6

洛谷 P1653 猴子 解题报告的更多相关文章

  1. 洛谷 P2058 海港 解题报告

    P2058 海港 题目描述 小K是一个海港的海关工作人员,每天都有许多船只到达海港,船上通常有很多来自不同国家的乘客. 小K对这些到达海港的船只非常感兴趣,他按照时间记录下了到达海港的每一艘船只情况: ...

  2. 洛谷 P3956 棋盘 解题报告

    P3956 棋盘 题目描述 有一个\(m×m\)的棋盘,棋盘上每一个格子可能是红色.黄色或没有任何颜色的.你现在要从棋盘的最左上角走到棋盘的最右下角. 任何一个时刻,你所站在的位置必须是有颜色的(不能 ...

  3. 洛谷 P1979 华容道 解题报告

    P1979 华容道 题目描述 小\(B\)最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面, 华容道是否根本就无法完成,如果能完成, 最少需要多少时 ...

  4. BZOJ 3545 / 洛谷 P4197 Peaks 解题报告

    P4197 Peaks 题目描述 在\(\text{Bytemountains}\)有\(N\)座山峰,每座山峰有他的高度\(h_i\).有些山峰之间有双向道路相连,共\(M\)条路径,每条路径有一个 ...

  5. 虔诚的墓主人(BZOJ1227)(洛谷P2154)解题报告

    题目描述 小W是一片新造公墓的管理人.公墓可以看成一块N×M的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地. 当地的居民都是非常虔诚的基督徒,他们愿意提前为自己找一块合适墓地. ...

  6. 洛谷P1653 猴子

    #include<bits/stdc++.h> using namespace std; inline void read(int &tmp) { ;char c=getchar( ...

  7. 洛谷 P2672 推销员 解题报告

    P2672 推销员 题目描述 阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户.螺丝街一共有N家住户,第i家住户到入口的距离为 ...

  8. 洛谷 P2679 子串 解题报告

    P2679 子串 题目描述 有两个仅包含小写英文字母的字符串\(A\)和\(B\). 现在要从字符串\(A\)中取出\(k\)个互不重叠的非空子串,然后把这\(k\)个子串按照其在字符串\(A\)中出 ...

  9. 洛谷 P1076 寻宝 解题报告

    P1076 寻宝 题目描述 传说很遥远的藏宝楼顶层藏着诱人的宝藏.小明历尽千辛万苦终于找到传说中的这个藏宝楼,藏宝楼的门口竖着一个木板,上面写有几个大字:寻宝说明书.说明书的内容如下: 藏宝楼共有\( ...

随机推荐

  1. CentOS 7.2安装11g数据库软件

      Preface       Yesterday I've installed the 11g GI software on CentOS 7.2.But I still encounter som ...

  2. 负数取余/整除,Python和C语言的不同

    总结一句:Python中负数整除,是向负无穷取整,所以导致负数取余不对 在数学公式中,两种语言的表示算法都是一样的,都是: r=a-n*[a/n] 以上,r是余数,a是被除数,n是除数. 唯一不同点, ...

  3. JMeter录制Web脚本

    设置Firefox浏览器代理, 点击右上角的菜单: 点击选项: 点击高级: 点击设置: 点击手动配置代理, 输入本地的IP地址和端口号8888,与JMeter代理服务器的端口号保持一致: 好了,浏览器 ...

  4. AngularJS 初探

    AngularJS,诞生于2009年,由Misko Hevery等人创建,后为Google所收购.这是一款优秀的前端JS框架,已经被用于Google的多款产品当中.AngularJS有着诸多特性,最为 ...

  5. [Clr via C#读书笔记]Cp18 定制Attribute

    Cp18 定制Attribute 意义 利用Attribute,可以声明性的给自己的代码结构创建注解,从而实现一些特殊的功能:最终在元数据中生成,这种可扩展的元数据信息可以在运行时的时候查询,从而动态 ...

  6. 【第四章】Shell 条件测试表达式

    shell中条件测试的三种格式: 格式1: test 条件表达式格式2: [ 条件表达式 ]格式3: [[ 条件表达式 ]] 使用test: [root@host- ~]# test -f file ...

  7. 简单构建基于RDF和SPARQL的KBQA(知识图谱问答系统)

    本文主要通过python实例讲解基于RDF和SPARQL的KBQA系统的构建.该项目可在python2和python3上运行通过. 注:KBQA即是我们通常所说的基于知识图谱的问答系统.这里简单构建的 ...

  8. 五:ResourceManager High Availability RM 高可用

    RM有单点失败的风险,但是可以做HA.  RMs HA通过master/standby这种结构实现,一个master是active的,其它standby是inactive的.可能通过命令行切换主备节点 ...

  9. 2017秋-软件工程第四次作业(2)-结对使用TDD框架完成单元测试

    第一次接触“单元测试”这个要求,我和队友学习了一些示例后开始操作.如下展示一些建立单元测试的过程.Step1:右键单击[解决方案]->左键单击[添加(D)]->[新建项目(N)]. Ste ...

  10. dataTables基础函数变量

    DataTable下有四个命名空间(namespace),分别是defaults,ext,models,oApi. Defaults:主要是用于初始化表格的一些选项. Ext:拓展项,提供额外的表格选 ...