BZOJ 3037 创世纪
2024-10-21 04:08:33
题解:
首先从基环树上的环上选两个点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 ;
}
最新文章
- iframe关于滚动条的去除和保留
- 10 Symbol
- echarts之tooltip
- 【转载】 删除Win10“这台电脑”中的6个文件夹
- RK 61 键盘 Ubuntu 下键位映射修改方案
- 【zTree】 zTree使用的 小例子
- WCF Data Service 使用小结(二) —— 使用WCF Data Service 创建OData服务
- 开源App之MyHearts(二)
- Python通过Manager方式实现多个无关联进程共享数据
- MSP430F5438点亮led
- 客户Oracle数据库在插入数据的时候报超出最大长度的错误(规避风险)
- iOS 开发者证书总结
- ABP入门系列(7)——分页实现
- Lesser known dplyr tricks
- hello 内核模块
- IAR Embedded Workbench for ARM 8.22.1 基础使用教程
- Android 自定义TextView 实现文本间距
- query compiler
- 本地git仓库常用操作
- NO.8:自学python之路------并行socket网络编程
热门文章
- 研读:Shielding applications from an untrusted cloud with Haven
- linux中判断符号[]注意事项
- Spket安装
- 【Web API系列教程】3.10 — 实战:处理数据(公布App到Azure App Service)
- HDU BestCoder Round #1 1002 项目管理
- HTML5 2D平台游戏开发#1
- SpringMvc自动代理
- 宜信开源|微服务任务调度平台SIA-TASK入手实践
- php nginx超时出错
- CentOS6下基于Nginx搭建mp4/flv流媒体服务器