[2017SEERC]Divide and Conquer
https://www.zybuluo.com/ysner/note/1308834
题面
一个有\(n\)个点的图,上面有有两棵不同的生成树。问至少切断几条边,可以使原图不联通。并输出方案数。
- \(n\leq10^6\)
解析
或许是道树上差分模板题?
首先,由于只有\(2n-2\)条边,故所有点的最小度数只能为\(2\)或\(3\)(若度数为\(4\),需要\(2n\)条边)。
所以答案也只能是\(2\)或\(3\)。
那么,肯定在某一棵生成树上只割了一条边。
一开始想法是枚举这条边是哪个,再查一查切断这条边后,该边两个端点被几条线段连接。
然而复杂度不对,差分\(O(n^2)\),树链剖分+线段树\(O(nlog^2n)\)。
实际上把一棵树上的所有边都用来覆盖另一棵树(即覆盖两端点的树上路径),再统计一下哪条边被覆盖次数最少,\(+1\)(这棵树上只切一条边)就是答案。(代码中\(/2\)是因为边是双向的,都加了两次)
这个可以用差分来完成。
如果答案是\(3\),则可能在另一棵树上只割一条边。反向覆盖+差分来统计方案数即可。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#define ll long long
#define re register
#define il inline
#define fp(i,a,b) for(re int i=a;i<=b;i++)
#define fq(i,a,b) for(re int i=a;i>=b;i--)
using namespace std;
const int N=2e6+100;
int n,m,h[2][N],cnt[2],f[N],s[N],lca[N],vis[N],mn=1e9,ans;
struct Edge{int to,nxt;}e[2][N<<1];
il void add(re int u,re int v){e[m][++cnt[m]]=(Edge){v,h[m][u]};h[m][u]=cnt[m];}
il int find(re int x){return x==f[x]?x:f[x]=find(f[x]);}
il ll gi()
{
re ll x=0,t=1;
re char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-') t=-1,ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*t;
}
il void dfs(re int u)
{
vis[u]=1;
for(re int i=h[m][u];i+1;i=e[m][i].nxt)
{
re int v=e[m][i].to;
if(vis[v]) continue;
dfs(v);
f[v]=u;
}
for(re int i=h[m^1][u];i+1;i=e[m^1][i].nxt)
{
re int v=e[m^1][i].to;
if(vis[v]==2) lca[i>>1]=find(v);
}
vis[u]=2;
}
il void calc(re int u,re int fa)
{
for(re int i=h[m][u];i+1;i=e[m][i].nxt)
{
re int v=e[m][i].to;
if(v==fa) continue;
calc(v,u);
s[u]+=s[v];
}
if(!fa) return;
if((s[u]>>1)+1<mn) mn=(s[u]>>1)+1,ans=1;
else if((s[u]>>1)+1==mn) ++ans;
}
il void solve()
{
memset(s,0,sizeof(s));memset(vis,0,sizeof(vis));
fp(i,1,n) f[i]=i;
dfs(1);
fp(u,1,n)
for(re int i=h[m^1][u];i+1;i=e[m^1][i].nxt)
{
re int v=e[m^1][i].to;
++s[u];++s[v];s[lca[i>>1]]-=2;
}
calc(1,0);
}
int main()
{
freopen("xianjian.in","r",stdin);
freopen("xianjian.out","w",stdout);
memset(h,-1,sizeof(h));cnt[0]=cnt[1]=1;
n=gi();
fp(i,1,2*n-2)
{
if(i==n) m=1;
re int u=gi(),v=gi();
add(u,v);add(v,u);
}
m=0;solve();
if(mn==3) m=1,solve();
printf("%d %d\n",mn,ans);
fclose(stdin);
fclose(stdout);
return 0;
}
[2017SEERC]Divide and Conquer的更多相关文章
- [LeetCode] 236. Lowest Common Ancestor of a Binary Tree_ Medium tag: DFS, Divide and conquer
Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree. According ...
- [LeetCode] 系统刷题4_Binary Tree & Divide and Conquer
参考[LeetCode] questions conlusion_InOrder, PreOrder, PostOrder traversal 可以对binary tree进行遍历. 此处说明Divi ...
- [LeetCode] 124. Binary Tree Maximum Path Sum_ Hard tag: DFS recursive, Divide and conquer
Given a non-empty binary tree, find the maximum path sum. For this problem, a path is defined as any ...
- 算法与数据结构基础 - 分治法(Divide and Conquer)
分治法基础 分治法(Divide and Conquer)顾名思义,思想核心是将问题拆分为子问题,对子问题求解.最终合并结果,分治法用伪代码表示如下: function f(input x size ...
- 算法上机题目mergesort,priority queue,Quicksort,divide and conquer
1.Implement exercise 2.3-7. 2. Implement priority queue. 3. Implement Quicksort and answer the follo ...
- 【LeetCode】分治法 divide and conquer (共17题)
链接:https://leetcode.com/tag/divide-and-conquer/ [4]Median of Two Sorted Arrays [23]Merge k Sorted Li ...
- The Divide and Conquer Approach - 归并排序
The divide and conquer approach - 归并排序 归并排序所应用的理论思想叫做分治法. 分治法的思想是: 将问题分解为若干个规模较小,并且类似于原问题的子问题, 然后递归( ...
- [算法]分治算法(Divide and Conquer)
转载请注明:http://www.cnblogs.com/StartoverX/p/4575744.html 分治算法 在计算机科学中,分治法是建基于多项分支递归的一种很重要的算法范式.字面上的解释是 ...
- Divide and Conquer.(Merge Sort) by sixleaves
algo-C1-Introductionhtml, body {overflow-x: initial !important;}html { font-size: 14px; }body { marg ...
随机推荐
- Win2008 Server搭建流媒体服务(在线看电影)
什么是流媒体服务呢. 所谓流媒体是指采用流式传输的方式在Internet播放的媒体格式, 与需要将整个视频文件全部下载之后才能观看的传统方式相比, 流媒体技术是通过将视频文件经过特殊的压缩方式分成一个 ...
- Linux 文件与目录结构
[Linux文件] Linux 系统中一切皆文件. [Linux目录结构] --/bin 是Binary的缩写, 这个目录存放着最经常使用的命令. --/sbin s就是Super User的意思,这 ...
- dsu+树链剖分+树分治
dsu,对于无修改子树信息查询,并且操作支持undo的问题 暴力dfs,对于每个节点,对所有轻儿子dfs下去,然后再消除轻儿子的影响 dfs重儿子,然后dfs暴力恢复轻儿子们的影响,再把当前节点影响算 ...
- Python接口测试之报告(十五)
在本文章中,主要使用jenkins和编写的自动化测试代码,来生成漂亮的测试报告,关于什么是CI这些 我就不详细的介绍了,这里我们主要是实战为主. 首先搭建java的环境,这个这里不做介绍.搭建好jav ...
- xtu summer individual 5 A - To Add or Not to Add
To Add or Not to Add Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeFo ...
- 【裸的并查集】POJ 1611 The Suspects
http://poj.org/problem?id=1611 [Accepted] #include<iostream> #include<cstdio> #include&l ...
- BBS+Blog项目流程及补充知识点
项目流程: 1. 产品需求 (1)基于用户认证组件和Ajax实现登陆验证(图片验证码) (2)基于forms组件和Ajax实现注册功能 (3)设计系统首页(文章列表渲染) (4)设计个人站点页面 (5 ...
- Codeforces913F. Strongly Connected Tournament
n<=2000个人参加比赛,这样比:(这里的序号没按题目的)1.两两比一场,比完连个图,边i->j表示i赢了j.2.连完那个图强联通分量缩起来,强连通分量内继续比,即强连通分量递归进行1. ...
- cogs——1215. [Tyvj Aug11] 冗余电网
1215. [Tyvj Aug11] 冗余电网 ★ 输入文件:ugrid.in 输出文件:ugrid.out 简单对比 时间限制:1 s 内存限制:128 MB TYVJ八月月赛提高组 ...
- Redis集群方案之Twemproxy+HAProxy+Keepalived+Sentinel+主从复制(待实践)
首先说明一下,Twemproxy+HAProxy+Keepalived+Sentinel+主从复制-这里提到的技术不一定全部都用上,但是全部用上之后可以达到高可用. 主从复制:实现数据一式多份的保障. ...