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

【题解】
就是基环外向树森林找环,然后从环向外统计size就可以了。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define LL long long
#define rg register
#define N 200010
using namespace std;
int n,color,top,to[N],siz[N],st[N],pos[N];
bool v[N],c[N];
vector<int>from[N];
inline int read(){
int k=,f=; char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(''<=c&&c<='')k=k*+c-'',c=getchar();
return k*f;
}
void calc(int x){
v[x]=;
for(rg int i=;i<from[x].size();i++)if(!siz[from[x][i]]){
siz[from[x][i]]=siz[x]+; calc(from[x][i]);
}
}
void dfs(int x){
v[x]=; st[pos[x]=++top]=x;
if(pos[to[x]]){
int Size=top-pos[to[x]]+;
for(rg int i=pos[to[x]];i<=top;i++) siz[st[i]]=Size,c[st[i]]=;
for(rg int i=pos[to[x]];i<=top;i++) calc(st[i]);
// printf("%d %d\n",to[x],x);
top=pos[to[x]]--;
}
else dfs(to[x]);
top--; pos[x]=;
}
int main(){
n=read();
for(rg int i=;i<=n;i++) to[i]=read(),from[to[i]].push_back(i);
// for(rg int i=1;i<=n;i++){
// for(rg int j=0;j<from[i].size();j++) printf("%d ",from[i][j]); puts("");
// }
for(rg int i=;i<=n;i++) if(!v[i]) dfs(i);
for(rg int i=;i<=n;i++) printf("%d\n",siz[i]);
return ;
}
洛谷 2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm的更多相关文章
- 洛谷——P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm
P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 题意翻译 题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N< ...
- C++ 洛谷 P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 题解
P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 分析: 这棵树上有且仅有一个环 两种情况: 1.讨论一个点在环上,如果在则答案与它指向点相同, 2 ...
- 洛谷 P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm
题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100,000)个牛棚隔间中留下的糖果,以此来庆祝美国秋天的万圣节. 由于牛棚不太大,FJ通过指定奶牛必须遵 ...
- [洛谷P2921][USACO08DEC]在农场万圣节Trick or Treat on the Farm
题目大意:给你一张有向图,每个点最多一条出边,问从每个开始,走多少步会到一个已经过的点 题解:$tarjan$缩点,然后建反图$DP$ 卡点:无 C++ Code: #include <cstd ...
- Luogu 2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm
基环树森林,然而我比较菜,直接tarjan找环. 发现缩点之后变成了DAG,每一个点往下走一定会走到一个环,缩点之后搜一遍看看会走到哪个环以及那个环的编号是多少,答案就是环的$siz$$ + $要走的 ...
- 缩点【洛谷P2921】 [USACO08DEC]在农场万圣节Trick or Treat on the Farm
[洛谷P2921] [USACO08DEC]在农场万圣节Trick or Treat on the Farm 题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N< ...
- LGOJ P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm
今天我来给大家带来一片蒟蒻题解 ~~真香 LGOJ P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 题目描述 每年,在威斯康星州,奶牛们都会穿上 ...
- P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm(Tarjan+记忆化)
P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 题意翻译 题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N< ...
- [USACO08DEC]在农场万圣节Trick or Treat on the Farm【Tarja缩点+dfs】
题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100,000)个牛棚隔间中留下的糖果,以此来庆祝美国秋天的万圣节. 由于牛棚不太大,FJ通过指定奶牛必须遵 ...
随机推荐
- POJ3675 Telescope 圆和多边形的交
POJ3675 用三角剖分可以轻松搞定,数据也小 随便AC. #include<iostream> #include<stdio.h> #include<stdlib.h ...
- 使用Java实现图像分割
为减少动画制作过程中的IO操作,我们可以使用连续动画来改善动画播放效率.如果我们对图像中的每张小图像单独分割成独立的文件,那么当每次要使用这些小图像的时候,我们都得从文件中读取图像信息. 实际上我们可 ...
- poj 1201 Intervals【差分约束+spfa】
设s为前缀和,首先显然的条件是\[ s_{bi}-s_{ai-1}>=c \],然后隐含的是\[ s_i-s_{i-1}>=0 s_i-s_{i-1}<=1 \] 然后根据差分约束, ...
- ASP.NET 知识点总结(七)
1.new修饰符是起什么作用new 修饰符用于声明类或类的成员,表示隐藏了基类中同名的成员.而new 操作符用于实例化一个类型new 修饰符只能用于继承类,一般用于弥补基类设计的不足new 修饰符和 ...
- vue中引入swiper插件
这里我们使用npm的方式安装swiper插件. 1.npm install vue-awesome-swiper --save 2.在main.js文件中引入文件 import Vue from 'v ...
- scala学习笔记3:基本控制结构基础
以下主要记录的是看完scala in programming这本书buildin control structures(第七章)后的要点总结. 1,if,while,do while和for的用法和j ...
- idea工程jdk设置问题
经常用idea的朋友,会遇到一个问题,那就是你在单测的时候,会报一个jdk的错,截图如下: 我的解决方案是在pom.xml里配置一个节点: <properties> <maven.c ...
- ASP.NET文件操作
在开发Web程序时,不但有存储在数据库中和XML文件中的数据形式需要处理,而且还有很多诸如文本.Word文档和图片等格式的文件数据需要处理.尤其是在一些信息管理系统中,文档的处理流程贯穿了整个系统的运 ...
- MVC之模型绑定
1.前言 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方 ...
- 【工具】前端Photoshop
前端photoshop最常见问题: 字体单位换成像素:按下ctrl+k调出首选项,选择单位与标尺,在里面把文字单位由点改为像素就行了.不过要注意的是,点是很多软件里面文字的默认单位.像素是虚拟单位,如 ...