今天我来给大家带来一片蒟蒻题解 ~~真香

LGOJ P2921  [USACO08DEC]在农场万圣节Trick or Treat on the Farm


题目描述

每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100,000)个牛棚隔间中留下的糖果,以此来庆祝美国秋天的万圣节。

由于牛棚不太大,FJ通过指定奶牛必须遵循的穿越路线来确保奶牛的乐趣。为了实现这个让奶牛在牛棚里来回穿梭的方案,FJ在第i号隔间上张贴了一个“下一个隔间”Next_i(1<=Next_i<=N),告诉奶牛要去的下一个隔间;这样,为了收集它们的糖果,奶牛就会在牛棚里来回穿梭了。

FJ命令奶牛i应该从i号隔间开始收集糖果。如果一只奶牛回到某一个她已经去过的隔间,她就会停止收集糖果。

在被迫停止收集糖果之前,计算一下每头奶牛要前往的隔间数(包含起点)。

输入格式

第1行 整数n。

第2行到n+1行 每行包含一个整数 next_i 。

输入输出样例

in 1:

4
1
3
2
3

out 1:

1

2

2

3      


思路引导:

  clearly,我们可以发现cow是一圈圈走的。看到圈我们想到什么?对,是环。怎样快速地判断一根环呢?不会是O(n)查找吧。。。这时,我们就可以使用一种特别简便的数据结构,就是并查集。并查集的算法研究,可以追溯到20世纪30年代,上海黑帮黑吃黑。不同于黑帮互殴的是,并查集的帮派只看coder的意思,没有流血伤亡,全是光荣革命,通过coder的淳淳教导(启发式搜索),还可以加快黑帮合并的速度,还有一种更加strong的办法,叫做路径压缩,可以是黑帮的每个人都直接听命于老大,时间复杂度直接降到了常数级别!这么好的方法,我们想到了,当然要用一用啦。在这道题中,我们的用法又略有不同。话不多说,上代码。代码有详解。

/*
Name: Trick or Treat on the Farm
Author: Jack
Date: 05-04-19 20:38
Description:
    节点:房间。
    环:cow按指示走直到不得不停时走过节点组成的环
*/
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+;
int dfn[maxn],inloop[maxn],col[maxn],nxt[maxn],loopsize[maxn];
//dfn:时间戳,记录访问到当前节点时的时间,辅助inloop
//inloop:入环时间戳,记录访问到这个环时,时间是多少
//col:并查集,记录每个节点的祖先。本题较特殊,不是用具体的节点作为祖先,而是用一个概念“牛”,将牛的编号作为祖先,所以并查集一般的操作都用不了。As the matter of fact,本题是可以用节点作为祖先解决的。但那样思路会有点卡壳,所以还是hack掉了。
//nxt:每个节点连接的下一个节点
//loopsize:环的节点个数
int n;void init(){
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&nxt[i]);
memset(dfn,,sizeof(dfn));
memset(col,,sizeof(col));
memset(loopsize,,sizeof(loopsize));
  //输入以及都清空。
}
void work(){
for(int now=;now<=n;now++){//按每只牛循环。
for(int i=now,cnt=;;i=nxt[i],cnt++){
        //按访问顺序访问
if(!col[i]){
col[i]=now;//这个房间归这头牛了
dfn[i]=cnt;//时间戳就是cnt
}
else if(col[i]==now){
//如果回到了自己的地盘
          loopsize[now]=cnt-dfn[i];
          //环的大小=访问最后一个点的时间-访问第一个点的时间
inloop[now]=dfn[i];
          //入环时间=访问第一个点的时间
printf("%d\n",cnt);
break;
} else {
          //如果来到了他人的领地,就扩充自己的领地
loopsize[now]=loopsize[col[i]];
//环的大小=他人领地的大小
          inloop[now]=cnt+max(inloop[col[i]]-dfn[i],);
          //入环时间=访问最后一个点的时间加后面这一串,留作思考题,自己想
          printf("%d\n",inloop[now]+loopsize[now]);
          break;
       }
}
    }
} int main(){
   init();
   work();
   return ;
}
完美结束

OK,谢谢观赏,各位看官觉得写得好的点个赞呗~~

LGOJ P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm的更多相关文章

  1. P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm(Tarjan+记忆化)

    P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 题意翻译 题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N< ...

  2. 洛谷——P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm

    P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 题意翻译 题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N< ...

  3. C++ 洛谷 P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 题解

    P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 分析: 这棵树上有且仅有一个环 两种情况: 1.讨论一个点在环上,如果在则答案与它指向点相同, 2 ...

  4. P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 记忆化搜索dfs

    题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100,000)个牛棚隔间中留下的糖果,以此来庆祝美国秋天的万圣节. 由于牛棚不太大,FJ通过指定奶牛必须遵 ...

  5. 洛谷 P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm

    题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100,000)个牛棚隔间中留下的糖果,以此来庆祝美国秋天的万圣节. 由于牛棚不太大,FJ通过指定奶牛必须遵 ...

  6. P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm

    对于一个牛,它存在两种状态:1.处于联通分量 2.不处于联通分量.对于处于联通分量的牛,求出联通分量的大小:对于不处于联通分量的牛,求出其距离联通分量的路程+联通分量大小. 不同的联通分量,染上不同的 ...

  7. [P2921][USACO08DEC]在农场万圣节Trick or Treat on the Farm (记忆化搜索/DP?,Tarjan?)

    第一看还以为是水题 随便打了一个bfs只有40分…… 然后开始颓废 #include<bits/stdc++.h> #define N 100005 using namespace std ...

  8. [洛谷P2921][USACO08DEC]在农场万圣节Trick or Treat on the Farm

    题目大意:给你一张有向图,每个点最多一条出边,问从每个开始,走多少步会到一个已经过的点 题解:$tarjan$缩点,然后建反图$DP$ 卡点:无 C++ Code: #include <cstd ...

  9. LUOGU P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm

    传送门 解题思路 记忆化搜索,如果搜到环,就将环的大小处理出来. 代码 #include<iostream> #include<cstdio> #include<cstr ...

随机推荐

  1. Python中怎么读写文件

    python中对文件的操作大概分为三步:打开文件.操作文件(读.写.追加写入).关闭文件. 1.无论对文件做哪种操作,操作前首先要保证文件被打开了,即需要一个打开的操作. 例:open(XXX.txt ...

  2. Arthur and Questions CodeForces - 518E (贪心模拟)

    大意: 给定序列$a$, 某些位置为'?', 求给'?'赋值使得序列$(a_1+a_2+...+a_k,a_2+a_3+...+a_{k+1},...)严格递增, 且$\sum|a_i|$最小. 化简 ...

  3. python 字符串替换、正则查找替换

    import re if __name__ == "__main__": url = " \n deded<a href = "">这是第 ...

  4. MongoVUE的table view视图不显示列标题

    近来项目用到mongodb,遂装了个MongoVUE,当然是破解版的. 但是发现个小问题,就是table view视图下列标题文字标签不见了,Find的执行按钮也是空白一片: 开始以为破解的不彻底,重 ...

  5. python-json函数

    json函数使用 JSON 函数需要导入 json 库:import jsonjson函数包含:json.dumps,json.loads,json.load,json.dump #1.json.du ...

  6. 51nod-1627 瞬间移动(组合数+逆元)

    题目描述: 有一个无限大的矩形,初始时你在左上角(即第一行第一列),每次你都可以选择一个右下方格子,并瞬移过去(如从下图中的红色格子能直接瞬移到蓝色格子),求到第n行第m列的格子有几种方案,答案对10 ...

  7. recyclerview 主活动里监听点击事件

    记性真的不行啊...贴上来有时间多复习复习 主活动 package com.example.com.webtext; import android.content.Intent; import and ...

  8. docker容器自动化部署(一)

    1.docker容器暴露多个端口 To expose just one port, this is what you need to do: docker run -p <host_port&g ...

  9. SVN上传文件自动更新到发布站点

    源码安装svn, version 1.9.5 ###########服务端源码安装############# IP:192.168.1.13 安装依赖:              # yum -y i ...

  10. Objective-C基础教程 笔记

    一.对C的扩展 1. #import VS #include C语言使用#include语句通知编译器应在头文件中查询定义. OC中也可以使用#include,但几乎不这么用,而是使用#import. ...