2017 SEERC Divide and Conquer 树上差分

题目

题目大意:给出两颗树的复合图(即这张图是由两颗树拼起来的),询问最小割掉多少条边,可以使得图不联通,并输出方案数。

分析

我觉得这是一道很难的题目,因为比较难想,前提结论比较多。

首先我们需要得到一个结论:就是割掉的边数不可能超过3。
证明:如果割掉的边数超过3,那么意味着每个点的度数都要4≥4,这也就是说,图中至少需要2n2n条边,而图是由两个树拼成的,边数只有2n22n−2条边,显然不可能。

既然割掉的边数2e32≤e≤3,那么我们可以得到结论:割掉的边既有属于A树的,也有属于B树的,如果割掉的边数为2,那么说明A树一条割边,B树一条割边。
如果割掉的边数为3,那么必有一棵树只包含一条割边。

因此,我们可以发现,如果我们以其中的一棵树(举例A树,这棵树只包含一条割边)作为主树的话,相当于将这颗树切成两边,并且求交叉于这棵树两边的B树树边的数量。
如图所示:
这里写图片描述

其中红线表示切割的位置,其中割掉的边数为 AA1条+BB2条 = 33 条。

最后一个问题,怎么求A树的两个部分中B树横跨了多少边呢?
这就要用到树上差分了,由于A树的两个部分中必有一个是A树的子树,这意味着我们可以使用dfs来遍历,其次,B树的边如果链接的两个点是属于A树一个部分的时候,那么对结果没有影响。
因此,我们给B树的边(u,v)做如下操作mk[u]++,mk[v]++,mk[lca(u,v)]=2;mk[u]++,mk[v]++,mk[lca(u,v)]−=2;
这样的话,我们只需要统计A的子树有mkmk的和,就可以知道链接A树的两个部分有多少条B树的边了。

注意

当答案是2的时候,我们直接输出方案数即可,而当答案是3的时候,我们需要交换A、B,并再次计算方案数,因为答案是3的情况方案数可能增加。

代码

#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
const int maxn = 1e5+7;
vector<int> A[maxn],B[maxn],V[maxn];
int n,dep[maxn],pa[maxn][22],mk[maxn];
inline int getint(){int tmp;cin>>tmp;return tmp;}
int mi = 1e9,ans = 0;
void dfs(int u,int fa){pa[u][0] = fa;dep[u] = dep[fa] + 1;for(auto v : V[u]){if(v == fa) continue;dfs(v,u);}
}
#define pr(x) cout<<#x<<":"<<x<<endl
int lca(int u,int v){if(dep[u] < dep[v]) swap(u,v);int d = dep[u] - dep[v];for(int i = 0;d;i++,d >>= 1) if(d & 1) u = pa[u][i];for(int i = 20;~i;i--) if(pa[u][i] != pa[v][i]) u = pa[u][i],v = pa[v][i];if(u != v) u = pa[u][0],v = pa[v][0];return u;
}void dfs2(int u,int fa){for(int v : V[u]){if(v == fa) continue;dfs2(v,u);mk[u] += mk[v];}if(u == 1) return ;if(mk[u] + 1 < mi){mi = mk[u] + 1;ans = 1;}else if(mk[u] + 1 == mi) ++ans;
}void solve(vector<int> A[maxn],vector<int> B[maxn]){for(int i = 1;i <= n;++i) V[i].clear();for(int u = 1;u <= n;++u) for(int v : A[u]){V[u].push_back(v);V[v].push_back(u);}memset(dep,0,sizeof(dep));memset(pa,0,sizeof(pa));memset(mk,0,sizeof(mk));dfs(1,0);for(int t = 1;t <= 20;++t){for(int i = 1;i <= n;++i){pa[i][t] = pa[pa[i][t-1]][t-1];}}for(int u = 1;u <= n;++u) for(int v : B[u]){mk[v] ++,mk[u] ++,mk[lca(u,v)] -= 2;}dfs2(1,0);}
signed main()
{ios::sync_with_stdio(false);n = getint();int u,v;for(int i = 0;i < n-1;++i) {u = getint();v = getint();A[u].push_back(v);}for(int i = 0;i < n-1;++i) {u = getint(),v = getint();B[u].push_back(v);}solve(A,B);if(mi == 2) return 0*printf("%d %d\n",mi,ans);solve(B,A);cout<<mi<<' '<<ans<<endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321154.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P2414-[NOI2011]阿狸的打字机【AC自动机,树状数组】

正题 题目链接:https://www.luogu.com.cn/problem/P2414 题目大意 一个子串表示操作有 往凹槽里打一个字母删除最后一个字母将凹槽中的字母打印到一个新的行里&#xff08;原来的不会消失&#xff09; 然后每次询问两个数字(x,y)(x,y)(x,y)表示询问第xxx行的字串在第yyy行的…

青蛙跳荷叶

青蛙跳荷叶 题目大意&#xff1a; 有n个点&#xff0c;从1开始到跳完这些点&#xff0c;且每次的距离不能相等&#xff0c;一个点不能到多次 原题&#xff1a; 题目描述 从前&#xff0c;有一个小青蛙决定去荷叶上练习跳跃.现在有n个荷叶排成一排&#xff0c;小青蛙一开始…

基于 Consul 实现 MagicOnion(GRpc) 服务注册与发现

0.简介0.1 什么是 ConsulConsul是HashiCorp公司推出的开源工具&#xff0c;用于实现分布式系统的服务发现与配置。这里所谓的服务&#xff0c;不仅仅包括常用的 Api 这些服务&#xff0c;也包括软件开发过程当中所需要的诸如 Rpc、Redis、Mysql 等需要调用的资源。简而言之 Con…

2017 ACM Jordanian Collegiate J.Efficiency Test 动态规划、类倍增

题目 题目链接 题解及代码 #include <iostream> #include <algorithm> #include <cstring> using namespace std; const int N 1e57; int f[2*N][55],a[2*N],sum[2*N],ans[2*N],pb[2*N]; int T,n,k; #define pr(x) cout<<#x<<":"&…

P3041-[USACO12JAN]Video Game G【AC自动机,dp】

正题 题目链接:https://www.luogu.com.cn/problem/P3041 题目大意 输入nnn个只有ABCABCABC的字符串&#xff0c;求一个长度为LLL的字符串中最多包含多少个子串是nnn个字符串中的一个 解题思路 考虑ACACAC自动机是如何进行匹配的&#xff0c;对于下一个字符&#xff0c;如果有…

【DFS】排排坐

排排坐 题目大意&#xff1a; 有n个方块&#xff0c;有一些是黑色&#xff0c;有一些是白色&#xff0c;可以点击一个方块使它和它旁边的方块反转颜色&#xff08;黑变白&#xff0c;白变黑&#xff09;&#xff0c;问最少要点多少次才能将方块 们 变成目标的方块们&#xff…

用ASP.NET Core 2.1 建立规范的 REST API -- 保护API和其它

预备知识: 用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识 用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识 (2) 准备项目建立成熟度2级的 API请看这里&#xff1a;用ASP.NET Core 2.0 建立规范的 REST API -- GET 和 POST, 用ASP.NET Core 2.0 建立规范的 REST AP…

CERC2017 Gambling Guide,最短路变形,期望dp

题目链接 题面链接 题意 给定一个无向图&#xff0c;你需要从11点出发到达n" role="presentation" style="position: relative;">nn点&#xff0c;你在每一点的时候&#xff0c;使用11个单位的代价,随机得到相邻点的票,但是你可以选择留在原地…

P4045-[JSOI2009]密码【AC自动机,状压dp】

正题 题目链接:https://www.luogu.com.cn/problem/P4045 题目大意 给nnn个字符串&#xff0c;求有多少个长度为lll的字符串包含所有给出的字符串 解题思路 因为nnn很小&#xff0c;考虑状压dpdpdp&#xff0c;因为是包含所有字符串&#xff0c;考虑在ACACAC自动机上dpdpdp。…

华为资深工程师:码农很多,但程序员并不多......

“春节假期&#xff0c;与几位友人小聚&#xff0c;大家互道工作顺利、平安健康云云......期间一位驰骋商界多年的老友问&#xff1a;“你现在在华为做什么工作呀?”我很骄傲地说&#xff1a;”系统架构师“&#xff0c;可是他却愣了很久。但当我老婆在旁边补上一句“码农“时…

【DP】【递归】分离与合体

分离与合体 题目大意&#xff1a; 有n个区域&#xff0c;可以把它们分为两个区间&#xff0c;结果加上左边区间的最左区域的数和最右区域的数还有右边区间的最右区域的数&#xff0c;就这样不停分&#xff0c;使结果最大&#xff0c;并输出各分界线的位置&#xff08;按1/2,2…

NEERC2017 Laminar Family 树链剖分+LCA

题目链接 http://codeforces.com/gym/101630/attachments/download/6401/20172018-acmicpc-northeastern-european-regional-contest-neerc-17-en.pdf 题意 给出一棵树和一组操作&#xff0c;操作的格式是给出u、vu、v两个节点&#xff0c;并将该节点所确定的路径上的节点全…

CF1009F-Dominant Indices【长链剖分】

正题 题目链接:https://www.luogu.com.cn/problem/CF1009F 题目大意 以1为根的一棵树&#xff0c;对于每个节点xxx求一个最小的kkk使得以xxx为根的子树中第kkk层的结点最多。 解题思路 我们先进行一次长链剖分&#xff0c;对于一个长链我们可以发现如果每次往下做的话&#…

VS2017 15.8第二个预览版本提升了对CPU Profiling和F#的支持

VS2017 15.8第一个预览版本的特性包括对ARM64构建的支持、ASP.NET Core对Docker的支持以及重新引入LibMan。在15.8的第二个预览版本中&#xff0c;微软发布了一个新Google Android模拟器的预览功能&#xff0c;它能够与Hyper-V兼容。这样的话&#xff0c;最新的Android模拟器就…

【SPFA】腾讯大战360

腾讯大战360 题目大意&#xff1a; 有n个点&#xff0c;还有m条线连接着这些点&#xff0c;有两个人在其中两个点上&#xff0c;让这两个人相遇最快要多久 原题&#xff1a; 题目描述 2010年11月3日&#xff0c;是一个难忘的日子。 腾讯发布消息&#xff1a;存360则&#…

一道有趣的最短路 NEERC2017 Journey from Petersburg to Moscow

题目链接 http://codeforces.com/gym/101630/attachments/download/6401/20172018-acmicpc-northeastern-european-regional-contest-neerc-17-en.pdf 题意 求11到n" role="presentation" style="position: relative;">nn的最短路&#xff0c;最…

P5904-[POI2014]HOT-Hotels加强版【长链剖分,dp】

正题 题目链接:https://www.luogu.com.cn/problem/P5904 题目大意 nnn个点的一棵树&#xff0c;求有多少个点对(i,j,k)(i,j,k)(i,j,k)使得这三个点距离相等。 解题思路 有两种情况&#xff0c;一是iii是j,kj,kj,k的祖先&#xff0c;二是i,j,ki,j,ki,j,k互相没有祖先关系 考虑…

初一级模拟试题总结(2019.3.2)

成绩 rank算上了其他大佬 rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4111lyflyflyf400400400100100100100100100100100100100100100111wjjwjjwjj280280280100100100808080000100100100111tjhtjhtjh200200200100100100000000100100100111fyfyfy200200200…

ASP.NET Core Razor生成Html静态文件

一、前言最近做项目的时候&#xff0c;使用Util进行开发&#xff0c;使用Razor写前端页面。初次使用感觉还是不大习惯&#xff0c;之前都是前后端分离的方式开发的&#xff0c;但是使用Util封装后的Angular后&#xff0c;感觉开发效率还是杠杠滴。二、问题在发布代码的时候&…

NEERC2017 Archery Tournament 线段树 新套路

题目链接 http://codeforces.com/gym/101630/attachments/download/6401/20172018-acmicpc-northeastern-european-regional-contest-neerc-17-en.pdf 题意 给出一些圆&#xff0c;这些圆圆心在x轴上方&#xff0c;且与x轴相切&#xff0c;任意时刻&#xff0c;不存在图上的…