BZOJ 3037 创世纪
题解:
首先从基环树上的环上选两个点x,y
断开x,y之间的边,然后做树形DP.
设f[x]为选x的情况下的最大值,g[x]为不选x的情况下的最大值.
分两种情况讨论,
1.选x,则y一开始就处于被支配状态,在计算y的f[]函数值时需要特判.
2.不选x,按正常DP做即可.
#include<cstdio>
#include<vector>
using namespace std;
#define ll long long
#define FILE "dealing"
#define up(i,j,n) for(int i=j;i<=n;i++)
#define db long double
#define pii pair<int,int>
#define pb push_back
#define mem(a,L) memset(a,0,sizeof(int)*(L+1))
template<class T> inline bool cmin(T& a,T b){return a>b?a=b,true:false;}
template<class T> inline bool cmax(T& a,T b){return a<b?a=b,true:false;}
template<class T> inline T squ(T a){return a*a;}
const ll maxn=+,inf=1e9+,limit=1e7;
int read(){
int x=,f=,ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<='')x=(x<<)+(x<<)+ch-'',ch=getchar();
return x*f;
}
int n;
vector<int> t[maxn];
int f[maxn],g[maxn],to[maxn];
int vis[maxn];
int rt,rt2,q[maxn],top=;
void dfs(int x){
q[++top]=x;
vis[x]=;
if(!vis[to[x]])dfs(to[x]);
else {
rt=x;
rt2=to[x];
}
}
void dfs2(int x){
vis[x]=;
for(int i=;i<t[x].size();i++)
if(!vis[t[x][i]])dfs2(t[x][i]);
if(!vis[to[x]])dfs2(to[x]);
}
//f[x] 选 g[x] 不选
int flag=;
void dfs1(int x){//选rt
f[x]=,g[x]=;int Max=-inf;
for(int i=;i<t[x].size();i++){
int y=t[x][i];if((x==rt2&&y==rt))continue;
dfs1(y);
f[x]+=f[y];
g[x]+=f[y];
cmax(Max,g[y]-f[y]);
}
f[x]+=Max;
if(x==rt2&&flag)f[x]-=Max;
cmax(f[x],);
} int main(){
freopen(FILE".in","r",stdin);
freopen(FILE".out","w",stdout);
n=read();
up(i,,n){
to[i]=read();
t[to[i]].push_back(i);
}
int ans=;
up(i,,n){
if(vis[i])continue;
top=;dfs(i);
while(top)vis[q[top--]]=;
dfs2(i);
int Ans=;
flag=;
dfs1(rt);
cmax(Ans,g[rt]);
flag=;
dfs1(rt);
cmax(Ans,f[rt]);
ans+=Ans;
}
printf("%d\n",ans);
return ;
}
BZOJ 3037 创世纪的更多相关文章
- BZOJ 3037 创世纪 树形DP
题目大意:给定一张有向图,每一个点有且仅有一条出边,要求若一个点x扔下去,至少存在一个保留的点y,y的出边指向x,求最多扔下去多少个点 首先原题的意思就是支配关系 我们反向考虑 求最少保留的点 要求一 ...
- 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个物品,每个物品可以且仅可以控制一个物品.问:选取一些物品,使得对于任意的一个被选取的物品来讲,都存在一个没有被选取的物 ...
- CH6401 创世纪
6401 创世纪 0x60「图论」例题 描述 上帝手中有 N(N≤10^6) 种世界元素,每种元素可以限制另外1种元素,把第 i 种世界元素能够限制的那种世界元素记为 A[i].现在,上帝要把它们中的 ...
- 图形学创世纪——写在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 上帝手 ...
随机推荐
- HDU 1041 Computer Transformation 数学DP题解
本题假设编程是使用DP思想直接打表就能够了. 假设是找规律就须要数学思维了. 规律就是看这些连续的0是从哪里来的. 我找到的规律是:1经过两次裂变之后就会产生一个00: 00经过两次裂变之后也会产生新 ...
- 高校师生福利!从现在起,可以免费申请LocaSpace和Wish3D的SDK!
目前,以管理空间数据见长的GIS已经在全球变化与监测.军事.资源管理.城市规划.土地管理.环境研究.灾害预测.交通管理.文物保护以及政府部门等许多领域发挥着越来越重要的作用. 如何开发出功能丰富又简洁 ...
- 【TSQL】空格的比较
空格比较时 空字符串跟任意长度的半角空格字符串比较,结果都为TRUE ) SET @TRUSTOR = '' IF @TRUSTOR IS NULL BEGIN SELECT 'IS NULL' EN ...
- x86 Android游戏开发专题篇之使用google breakpad捕捉c++崩溃(以cocos2dx为例)
近期一直都在x86设备上进行游戏开发.就c++层和Android java层倒没有什么要特别注意的(除了须要注意一下改动Application.mk指定平台外),在c++崩溃的时候,非常多时候看不到堆 ...
- 公司的mysql-installer-community-5.7.19.0安装注意
需要安装Microsoft Visual C++ 2013 Redistributable(x64) 和 Microsoft Visual C++ 2013 Redistributable(x86) ...
- Java Transaction Management
Just a few weeks ago, I had a discussion with one of my colleagues about how to manage the transacti ...
- OLR
OLR:Oracle Local Registry 环境:11.2.0.3 RAC RHEL6.5 It contains local node specific configuration re ...
- UNP学习笔记(第十六章 非阻塞I/O)
套接字的默认状态时阻塞的 可能阻塞的套接字调用可分为以下4类: 1.输入操作,包括read.readv.recv.recvfrom和recvmsg. 2.输入操作,包括write.writev.sen ...
- 【Web API系列教程】3.10 — 实战:处理数据(公布App到Azure App Service)
在这最后一节中.你将把应用程序公布到Azure.在Solution Explorer中,右击项目并选择Publish. 点击Publish打开Publish Web对话框. 假设你在新建项目的时候选中 ...
- 转:HDMI介绍与流程
HDMI介绍与流程 HDMI,全称为(High Definition Multimedia Interface)高清多媒体接口,主要用于传输高清音视频信号. HDMI引脚: HDMI有A,B,C, ...