[BZOJ3037] 创世纪 题解
基环内向树上 dp,不过在这里提供给一种非典型做法。
考虑将环上的每一条边都断开,这样就会形成多棵树,先在这些树上进行树形 \(dp\)。设 \(dp_{i,0/1}\) 表示不选/选 \(i\) 时,\(i\) 子树内的最大选点数。明显方程为:
\]
接下来,我们开始在环上找答案。考虑断环为链。设 \(f_{i,0/1,0/1}\) 表示在环上的第 \(i\) 个点,选不选,第 \(cnt\) 个点选不选,\(lp_i\) 表示环上第 \(i\) 个点的编号。则转移方程为:
f_{i,0,0/1}=\max(f_{i-1,0,0/1},f_{i-1,1,0/1})+dp_{lp_i,0}\\
f_{i,1,0/1}=\max(f_{i-1,0,0/1}+dp_{lp_i,0}+1,f_{i-1,1,0/1}+dp_{lp_i,1})
\end{cases}
\]
时间复杂度瓶颈为并查集(不知道并查集干什么用的,详见上一道题我写的题解),时间复杂度 \(O(n\log n)\)。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e6+5;
int n,m,h[N],to[N],nxt[N];
int cnt,lp[N],v[N],fh[N],ans;
int dp[N][2],f[N][2][2],t[N];
void add(int x,int y){
to[++m]=y;
nxt[m]=h[x];
h[x]=m;
}void init(){
for(int i=1;i<=n;i++)
fh[i]=i;
}int find
(int x){
if(fh[x]==x) return x;
return fh[x]=find(fh[x]);
}void unite(int x,int y){
x=find(x);
y=find(y);
if(x==y) return;
fh[y]=x;
}void dp_(int x){
int f=1,mn=1e9;
for(int i=h[x];i;i=nxt[i]){
if(v[to[i]]) continue;
int y=to[i];dp_(y);
dp[x][0]+=max(dp[y][0],dp[y][1]);
if(dp[y][0]>=dp[y][1]) f=0;
else mn=min(mn,dp[y][1]-dp[y][0]);
}dp[x][1]=dp[x][0]+1;
if(f) dp[x][1]-=mn;
}void solve(int rt){
int x=rt,y=t[rt];cnt=0;
lp[++cnt]=y;v[y]=1;
while(y!=x){
lp[++cnt]=t[y];
v[t[y]]=1;y=t[y];
}for(int i=1;i<=cnt;i++) dp_(lp[i]);
f[0][0][1]=f[0][1][0]=-1e9;
for(int i=1;i<=cnt;i++){
f[i][0][0]=max(f[i-1][0][0],f[i-1][1][0])+dp[lp[i]][0];
f[i][1][0]=max(f[i-1][0][0]+dp[lp[i]][0]+1,f[i-1][1][0]+dp[lp[i]][1]);
f[i][0][1]=max(f[i-1][0][1],f[i-1][1][1])+dp[lp[i]][0];
f[i][1][1]=max(f[i-1][0][1]+dp[lp[i]][0]+1,f[i-1][1][1]+dp[lp[i]][1]);
}ans+=max(f[cnt][0][0],f[cnt][1][1]);
}int main(){
scanf("%d",&n);init();
for(int i=1;i<=n;i++){
cin>>t[i];
add(t[i],i);
unite(t[i],i);
}for(int i=1;i<=n;i++)
if(find(i)==i) solve(i);
printf("%d",ans);
return 0;
}//Kaká
[BZOJ3037] 创世纪 题解的更多相关文章
- bzoj3037 创世纪
两种解法: 一.树状DP /*by SilverN*/ #include<iostream> #include<algorithm> #include<cstring&g ...
- BZOJ3037 创世纪[基环树DP]
实际上基环树DP的名字是假的.. 这个限制关系可以看成每个点有一条出边,所以就是一个内向基环树森林. 找出每个基环树的环,然后对于树的部分,做DP,设状态选或不选为$f_{x,0/1}$,则 $f_{ ...
- BZOJ3037 创世纪(基环树DP)
基环树DP,攻的当受的儿子,f表选,g表不选.并查集维护攻受关系.若有环则记录,DP受的后把它当祖宗,再DP攻的. #include <cstdio> #include <iostr ...
- 【BZOJ3037/2068】创世纪/[Poi2004]SZP 树形DP
[BZOJ3037]创世纪 Description applepi手里有一本书<创世纪>,里面记录了这样一个故事……上帝手中有着N 种被称作“世界元素”的东西,现在他要把它们中的一部分投放 ...
- [bzoj3037/2068]创世纪[Poi2004]SZP_树形dp_并查集_基环树
创世纪 SZP bzoj-3037/2068 Poi-2004 题目大意:给你n个物品,每个物品可以且仅可以控制一个物品.问:选取一些物品,使得对于任意的一个被选取的物品来讲,都存在一个没有被选取的物 ...
- Poetize4 创世纪
3037: 创世纪 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 123 Solved: 66[Submit][Status] Description ...
- CH6401 创世纪
6401 创世纪 0x60「图论」例题 描述 上帝手中有 N(N≤10^6) 种世界元素,每种元素可以限制另外1种元素,把第 i 种世界元素能够限制的那种世界元素记为 A[i].现在,上帝要把它们中的 ...
- 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 ...
- 为创世纪图书馆(Library Genesis)作镜像
简介 Library Genesis的Wikipedia条目中的介绍是: Library Genesis or LibGen is a search engine for articles and b ...
随机推荐
- Ant Design Pro项目一初始化就报a标签嵌套a标签错误<a> cannot as a descendant of <a>
前情 公司经常需要做一些后台管理页面,我们选择了Ant Design Pro,它是基于 Ant Design 和 umi 的封装的一整套企业级中后台前端/设计解决方案. 坑位 按官方文挡一步步下来,项 ...
- 【Amadeus原创】idea实现java前后端代码自动化调试
代码结构: 1,meeting-server 后端 springBoot maven 2,metting-ui 前端 nodejs 3,两个文件夹都在early-meeting文件夹中 如何在 ...
- Vue开启Gzip
Vue配置 1.安装 npm install --save-dev compression-webpack-plugin@5.0.0 const CompressionWebpackPlugin = ...
- 中电金信:加快企业 AI 平台升级,构建金融智能业务新引擎
在当今数字化时代的浪潮下,人工智能(AI)技术的蓬勃发展正为各行业带来前所未有的变革与创新契机.尤其是在金融领域,AI 模型的广泛应用已然成为提升竞争力.优化业务流程以及实现智能化转型的关键驱动力 ...
- 为什么C#越来越恶心
看看这个 再看这些 more 老子声明个空函数,没有访问数据请改为 static,真是越来越智障 为什么一个活泼的语言越搞越像 C++? C# 发明了各种可爱的小玩意儿,尤其是 async/await ...
- alibabacloud-jindodata
https://github.com/aliyun/alibabacloud-jindodata https://github.com/aliyun/alibabacloud-jindodata/bl ...
- springboot搭建http2服务器和h2c服务器 h2 的http/https 请求服务器
HTTP2.0特性通俗易懂篇:https://www.cnblogs.com/yingsmirk/p/5248506.html深入了解篇:https://www.jianshu.com/p/67c54 ...
- Qt编写视频监控系统75-计算实时码率并显示
一.前言 做监控摄像头的实时视频显示,一般还会要求统计实时码率显示在通道画面上,一个是为了测试下整个软件的性能,同时也看下当前到底是主码流还是子码流,设备到底是不是真的按照设定的码流大小来传输视频数据 ...
- CDS标准视图:总计应收款 I_TotalAccountsReceivables
视图名称:总计应收款 I_TotalAccountsReceivables 视图类型:参数 视图代码: 点击查看代码 @AbapCatalog.sqlViewName: 'IFITOTALACCTRB ...
- 微服务实战系列(四)-注册中心springcloud alibaba nacos-copy
1.场景描述 因要用到微服务,关于注册中心这块,与同事在技术原型上做了讨论,初步定的方案是使用:阿里巴巴的nacos+springcloud gateway,下面表格是同事整理的注册中心对比,以前用的 ...