CF1263F
题目描述
给出一个类似这样

的图,求删掉最多的黑边使得每个特殊点和至少一个节点1连通
保证上下两棵树都存在一种dfs序使得访问特殊点的顺序为1~n
题解
设f[i][j]表示上面的树最后一个特殊点为i,j同理的最小选取数
每次加上lca-->max(i,j)+1的路径,由于题目保证了dfs顺序,所以不会出现不合法的情况
code
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
#define min(a,b) (a<b?a:b)
#define max(a,b) (a>b?a:b)
using namespace std;
int a[10001][2];
int ls[5001];
int fa[2][5001][11];
int d[2][5001];
int f[1001][1001];
int n,A,B,i,j,k,l,len,ans;
void New(int x,int y)
{
++len;
a[len][0]=y;
a[len][1]=ls[x];
ls[x]=len;
}
void dfs(int type,int t)
{
int i;
fo(i,1,10)
fa[type][t][i]=fa[type][fa[type][t][i-1]][i-1];
if (t<=n) return;
for (i=ls[t]; i; i=a[i][1])
{
fa[type][a[i][0]][0]=t;
d[type][a[i][0]]=d[type][t]+1;
dfs(type,a[i][0]);
}
}
void swap(int &x,int &y)
{
int z=x;
x=y;
y=z;
}
int lca(int type,int x,int y)
{
int i;
if (!x)
{
if (!type)
return n+1;
else
return n+A+1;
}
if (d[type][x]<d[type][y]) swap(x,y);
fd(i,10,0)
if (d[type][fa[type][x][i]]>=d[type][y])
x=fa[type][x][i];
fd(i,10,0)
if (fa[type][x][i]!=fa[type][y][i])
x=fa[type][x][i],y=fa[type][y][i];
if (x!=y)
x=fa[type][x][0];
return x;
}
int main()
{
// freopen("f.in","r",stdin);
scanf("%d",&n);
scanf("%d",&A);
fo(i,2,A)
{
scanf("%d",&j);
New(j+n,i+n);
}
fo(i,1,n)
{
scanf("%d",&j);
New(j+n,i);
}
scanf("%d",&B);
fo(i,2,B)
{
scanf("%d",&j);
New(j+n+A,i+n+A);
}
fo(i,1,n)
{
scanf("%d",&j);
New(j+n+A,i);
}
d[0][n+1]=d[1][n+A+1]=1;
dfs(0,n+1);
dfs(1,n+A+1);
memset(f,127,sizeof(f));
f[0][0]=0;
fo(i,0,n-1)
{
fo(j,0,n-1)
{
k=max(i,j)+1;
l=lca(0,i,k);
f[k][j]=min(f[k][j],f[i][j]+(d[0][k]-d[0][l]-1));
l=lca(1,j,k);
f[i][k]=min(f[i][k],f[i][j]+(d[1][k]-d[1][l]-1));
}
}
ans=2133333333;
fo(i,0,n-1)
ans=min(ans,min(f[i][n],f[n][i]));
printf("%d\n",(A-1)+(B-1)-ans);
}
CF1263F的更多相关文章
- CF1263F Economic Difficulties(DP)
拿小号打了这场,然而做到这里时少看了条件,最后 10min 才发现,没有 AK,身败名裂-- 赛后看就是 sb 题-- (好像这题也不值 2500 吧?) 首先注意到一条很重要的条件:对于每棵树,都存 ...
随机推荐
- 【BW系列】SAP 讲讲BW/4 HANA和BW on HANA的区别
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[BW系列]SAP 讲讲BW/4 HANA和BW ...
- Cocos2d-X多线程(1) 在cocos2d-x中使用多线程
教科书上说:进程是资源分配的最小单位,线程是CPU调度的最小单位. 进程是程序在计算机上的一次执行活动.直观的讲就是会产生一个pid. int main() { //业务逻辑代码 re ...
- Python学习之面向对象(一)
第六章 面向对象 6.1 面向对象的初识 6.1.1 什么是面向对象 面向过程式编程: 好处:出色的完成所有的需求 坏处:凡是更改或者增加一条需求,可能整个项目都随之改变 面向对象式编程: 类 ...
- 关于confusion_matrix()返回的矩阵的索引顺序(类别顺序)
转载至:https://blog.csdn.net/m0_38061927/article/details/77198990 1.混淆矩阵 混淆矩阵是机器学习中总结分类模型预测结果的情形分析表,以矩阵 ...
- python关键字以及含义,用法
Python常用的关键字 1.and , or and , or 为逻辑关系用语,Python具有短路逻辑,False and 返回 False 不执行后面的语句, True or 直接返回Tru ...
- 纯JS实现多图片上传(在layui框架中)
HTML代码 <form id="form1" class="layui-form layui-form-pane" action="{:url ...
- Java最新学习线路(基础,源码,项目,实战)
如需获取以下学习资源请关注公众号:Java编程指南 我们为自学者编程的或初学java的小伙伴们准备了一整套完整的学习资源和文章,还有我自己在自学路上的一些总结和学习线路,希望能帮到小伙伴们,如果有什么 ...
- Java计算两个时间的天数差与月数差 LocalDateTime
/** * 计算两个时间点的天数差 * @param dt1 第一个时间点 * @param dt2 第二个时间点 * @return int,即要计算的天数差 */ public stat ...
- fid解释
VID就是VLAN ID,这个意思很明白.PVID就是PORT VID,当一个PORT属于多个VLAN时,当它收到不带TAG的数据时,它 就给数据加上TAG,其中VID=PVID.FID就是FILTE ...
- LeetCode_9_回文数字
回文数(LeetCode 9) 1.题目 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: 输入: - ...