CH6401 创世纪
6401 创世纪 0x60「图论」例题
描述
上帝手中有 N(N≤10^6) 种世界元素,每种元素可以限制另外1种元素,把第 i 种世界元素能够限制的那种世界元素记为 A[i]。现在,上帝要把它们中的一部分投放到一个新的空间中去建造世界。为了世界的和平与安宁,上帝希望所有被投放的世界元素都有至少一个没有被投放的世界元素限制它。上帝希望知道,在此前提下,他最多可以投放多少种世界元素?
输入格式
第一行是一个整数N,表示世界元素的数目。
第二行有N 个整数A1, A2, …, AN。Ai 表示第i 个世界元素能够限制的世界元素的编号。
输出格式
一个整数,表示最多可以投放的世界元素的数目。
样例输入
6
2 3 1 3 6 5
样例输出
3
数据范围与约定
- 对于30%的数据:
- 对于60%的数据:
- 对于100%的数据:
样例解释
对于30% 的数据,N≤10。
对于100% 的数据,N≤10^6,1≤Ai≤N。
来源
石家庄二中【Nescafé 8】杯NOIP模拟赛
</article>
题解
基环树上上司的舞会。经典做法:两次DP,一次断开,一次强制链接(通过适当的条件和赋值实现)。
对于这题,可以预处理son子树中的DP值,然后分类时特判不再对son进行DP,赋值调用即可。
时间复杂度\(O(n)\)
#include<bits/stdc++.h>
#define rg register
#define il inline
#define co const
template<class T>il T read(){
rg T data=0,w=1;rg char ch=getchar();
for(;!isdigit(ch);ch=getchar())if(ch=='-') w=-w;
for(;isdigit(ch);ch=getchar()) data=data*10+ch-'0';
return data*w;
}
template<class T>il T read(rg T&x) {return x=read<T>();}
typedef long long ll;
using namespace std;
co int N=1e6+1,INF=0x3f3f3f3f;
int n,fa[N],t,k,f[N][2],s[N][2],ans;
int Head[N],Edge[N*2],Next[N*2],tot;
int get(int x) {return fa[x]==x?x:fa[x]=get(fa[x]);}
il void add(int x,int y){
Edge[++tot]=y,Next[tot]=Head[x],Head[x]=tot;
}
void dfs(int x){
int num=INF;
f[x][0]=0;
for(int i=Head[x];i;i=Next[i]){
if(Edge[i]!=k) dfs(Edge[i]);
f[x][0]+=max(f[Edge[i]][0],f[Edge[i]][1]);
num=min(num,max(f[Edge[i]][0],f[Edge[i]][1])-f[Edge[i]][0]);
}
f[x][1]=f[x][0]+1-num;
}
int main(){
read(n);
for(int i=1;i<=n;++i) fa[i]=i;
for(int i=1;i<=n;++i){
int x=read<int>();
int p=get(x),q=get(i);
if(p==q) s[++t][0]=x,s[t][1]=i;
else add(x,i),fa[q]=p;
}
for(int i=1;i<=t;++i){
k=0;
dfs(s[i][0]);
k=s[i][0];
dfs(s[i][1]);
int now=max(f[s[i][1]][0],f[s[i][1]][1]);
f[s[i][0]][1]=f[s[i][0]][0]+1;
dfs(s[i][1]);
ans+=max(now,f[s[i][1]][0]);
}
printf("%d\n",ans);
return 0;
}
CH6401 创世纪的更多相关文章
- Poetize4 创世纪
3037: 创世纪 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 123 Solved: 66[Submit][Status] Description ...
- 为创世纪图书馆(Library Genesis)作镜像
简介 Library Genesis的Wikipedia条目中的介绍是: Library Genesis or LibGen is a search engine for articles and b ...
- 编程哲学之C#篇:01——创世纪
我们能否像神一样地创建一个世界? 对于创建世界而言,程序员的创作能力最接近于神--相对于导演,作家,漫画家而言,他们创建的世界(作品)一旦完成,就再也不会变化,创建的角色再也不会成长.而程序员创建的世 ...
- 【BZOJ3037/2068】创世纪/[Poi2004]SZP 树形DP
[BZOJ3037]创世纪 Description applepi手里有一本书<创世纪>,里面记录了这样一个故事……上帝手中有着N 种被称作“世界元素”的东西,现在他要把它们中的一部分投放 ...
- [bzoj3037/2068]创世纪[Poi2004]SZP_树形dp_并查集_基环树
创世纪 SZP bzoj-3037/2068 Poi-2004 题目大意:给你n个物品,每个物品可以且仅可以控制一个物品.问:选取一些物品,使得对于任意的一个被选取的物品来讲,都存在一个没有被选取的物 ...
- 图形学创世纪——写在SIGGRAPH 40年的边上
40年的边上" title="图形学创世纪--写在SIGGRAPH 40年的边上"> 前言: SIGGRAPH是由ACM SIGGRAPH(美国计算机协会计算机图形 ...
- JZOJ 3929. 【NOIP2014模拟11.6】创世纪
3929. [NOIP2014模拟11.6]创世纪 (Standard IO) Time Limits: 1000 ms Memory Limits: 65536 KB Description 上帝手 ...
- T1创世纪(原创)
创世纪 这是我的第一道原创题 题解: 这道题的核心算法是:加维度的最短路+贪心 状态:\(dis[i][j][t][a]\)表示在 \(t\) 时,到达 \((i,j)\) ,当前共造\(a\)只&q ...
- bzoj3037 创世纪
两种解法: 一.树状DP /*by SilverN*/ #include<iostream> #include<algorithm> #include<cstring&g ...
随机推荐
- javaScript的高级函数
1.map() map()方法返回一个新数组,新数组是原始数组调用函数之后处理后的值. map()方法按照原始数组元素顺序依次处理元素. map不会对空数组进行检测. map不会改变原始数组 . 参数 ...
- 【剑指offer】面试题 22. 链表中倒数第 K 个节点
面试题 22. 链表中倒数第 K 个节点
- lambda表达式笔记
前几天一位好友分享了一篇文章,其中讲到了lambda表达式,正好最近看了一些内容,就做做笔记吧... lambda表达式服务于函数式接口,如果需要一个函数式接口的对象时,就可以用lambda表达式代替 ...
- AssemblyVersion、AssemblyFileVersion、AssemblyInformationalVersion 区别
AssemblyVersion: 几乎保留在.NET内部,AssemblyFileVersion: 就是Windows所见.如果您转到位于目录中的程序集的属性并切换到版本选项卡, 映射到“文件版本”A ...
- 不是所有OutOfMemoryError异常都跟内存有关
一个老鸟遇到一个稀奇的问题后,如果只是想想,那么可能会失去一次丰富自己的机会. 如果从开始养成一个习惯,把所有难解决的问题都记录下来,面试的时候,也可能是给自己一次机会 *************** ...
- oracle 触发器的实例(转)
触发器使用教程和命名规范 目 录 目录 触发器使用教程和命名规范 1 1,触发器简介 1 2,触发器示例 2 3,触发器语法和功能 3 4,例一:行级触发器之一 4 5,例二:行级触发器之二 4 6 ...
- python PIL图像处理库
1. Introduction PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了. ...
- Java知识回顾 (11) 异常处理
距离最近的 Java知识回顾系列(10),2019.4.24日,到现在,已经近半年过去了. 感觉,做一件事情,如果有头无尾,实在不好,心里会一直悬着.所以,现在继续上面的内容. 再次声明,正如(1)中 ...
- mysql 设置局域网内可访问
今天同事要连我电脑的数据库 我以为只要127.0.0.1 可以访问就是 运行通过ip访问的... 然而并不是..这里记录下方法 1.打开命令行 进入你电脑的 mysql的bin 目录下 mys ...
- js 一些有意思的小Demo