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 创世纪的更多相关文章

  1. Poetize4 创世纪

    3037: 创世纪 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 123  Solved: 66[Submit][Status] Description ...

  2. 为创世纪图书馆(Library Genesis)作镜像

    简介 Library Genesis的Wikipedia条目中的介绍是: Library Genesis or LibGen is a search engine for articles and b ...

  3. 编程哲学之C#篇:01——创世纪

    我们能否像神一样地创建一个世界? 对于创建世界而言,程序员的创作能力最接近于神--相对于导演,作家,漫画家而言,他们创建的世界(作品)一旦完成,就再也不会变化,创建的角色再也不会成长.而程序员创建的世 ...

  4. 【BZOJ3037/2068】创世纪/[Poi2004]SZP 树形DP

    [BZOJ3037]创世纪 Description applepi手里有一本书<创世纪>,里面记录了这样一个故事……上帝手中有着N 种被称作“世界元素”的东西,现在他要把它们中的一部分投放 ...

  5. [bzoj3037/2068]创世纪[Poi2004]SZP_树形dp_并查集_基环树

    创世纪 SZP bzoj-3037/2068 Poi-2004 题目大意:给你n个物品,每个物品可以且仅可以控制一个物品.问:选取一些物品,使得对于任意的一个被选取的物品来讲,都存在一个没有被选取的物 ...

  6. 图形学创世纪——写在SIGGRAPH 40年的边上

    40年的边上" title="图形学创世纪--写在SIGGRAPH 40年的边上"> 前言: SIGGRAPH是由ACM SIGGRAPH(美国计算机协会计算机图形 ...

  7. JZOJ 3929. 【NOIP2014模拟11.6】创世纪

    3929. [NOIP2014模拟11.6]创世纪 (Standard IO) Time Limits: 1000 ms Memory Limits: 65536 KB Description 上帝手 ...

  8. T1创世纪(原创)

    创世纪 这是我的第一道原创题 题解: 这道题的核心算法是:加维度的最短路+贪心 状态:\(dis[i][j][t][a]\)表示在 \(t\) 时,到达 \((i,j)\) ,当前共造\(a\)只&q ...

  9. bzoj3037 创世纪

    两种解法: 一.树状DP /*by SilverN*/ #include<iostream> #include<algorithm> #include<cstring&g ...

随机推荐

  1. vscode failed to excute git

    将代码提交到github时 提示 “failed to excute git” 解决:配置git git config --global user.email "youremailid@ex ...

  2. win7蓝屏死机0x0000003B错误蓝屏故障解决

    win7蓝屏死机0x0000003B错误蓝屏故障解决 刚才一个朋友问我:电脑蓝屏了怎么办. 我问他要了电脑的截图,自己看了错误代码:0x0000003B 搜索资料,查询了一番.都是说电脑中病毒或者是系 ...

  3. OpenJudge 4152 最佳加法表达式

    总时间限制: 1000ms 内存限制: 65536kB 描述 给定n个1到9的数字,要求在数字之间摆放m个加号(加号两边必须有数字),使得所得到的加法表达式的值最小,并输出该值.例如,在1234中摆放 ...

  4. PHP检测日期格式

    <?php $date1 = '2019-01-01'; $date2 = '2019-01-01 23:59'; $date3 = '2019-01-01 23:59:59'; $date4 ...

  5. [转帖]抢先AMD一步,英特尔推出新处理器,支持LPDDR5!

    抢先AMD一步,英特尔推出新处理器,支持LPDDR5! http://www.eetop.cn/cpu_soc/6946240.html 2019.10 intel的最新技术发展. 近日,知名硬件爆料 ...

  6. spring整合quartz报错

    今天spring整合quartz报错,最后一步步排查,发现是和redis依赖冲突,最后redis升级了一下,问题解决. 总结:发现问题,逐一排查,如果是整合问题,报类加载不到的错误,大概率是和其他组件 ...

  7. (五)linux 学习 --重定向

    The Linux Command Line 读书笔记 - 部分内容来自 http://billie66.github.io/TLCL/book/chap07.html 文章目录 标准输入.输出.错误 ...

  8. Python开发之规范化目录

    13.规范化目录 规范目录优点: 可读性高 加载快 查询修改简 规范化目录结构 (1) start.py文件:首要配置启动文件,运行run()就可以执行项目 #start import sys imp ...

  9. flask框架(七)——蓝图、请求上下文、g对象、信号、flask_session

    蓝图 作用:对程序进行目录结构划分 不使用蓝图情况下,自己分文件 目录结构: -templates -views -__init__.py -user.py -order.py -app.py app ...

  10. 当base-package="controller.*"时,可见packageSearchPath为"classpath*:controller/*/**/*.class": 当base-package="controller.**"时,可见packageSearchPath为"classpath*:controller/**/**/*.class":

    今天在配置Spring的component-scan时,发现了一个有趣的问题.就是在指定base-package时,如果使用了星号通配符*,有时会出现类扫描不到的情况.下面研究一下这个问题. 先介绍一 ...