P2272 - Dark的锁链

Description

无向图中有N个节点和两类边,一类边被称为主要边,而另一类被称为附加边。Dark有N – 1条主要边,并且Dark的任意两个节点之间都存在一条只由主要边构成的路径。另外,Dark还有M条附加边。


你的任务是把Dark斩为不连通的两部分。一开始Dark的附加边都处于无敌状态,你只能选择一条主要边切断。一旦你切断了一条主要边,Dark就会进入防御模式,主要边会变为无敌的而附加边可以被切断。但是你的能力只能再切断Dark的一条附加边。现在你想要知道,一共有多少种方案可以击败Dark。注意,就算你第一步切断主要边之后就已经把Dark斩为两截,你也需要切断一条附加边才算击败了Dark。

Input

第一行包含两个整数N和M。

之后N – 1行,每行包括两个整数A和B,表示A和B之间有一条主要边。

之后M行以同样的格式给出附加边。

Output

输出一个整数表示答案。

Sample Input

4 1

1 2

2 3

1 4

3 4

Sample Output

3

Hint

对于20% 的数据,N≤100,M≤100。

对于100% 的数据,N≤100 000,M≤200 000。数据保证答案不超过2^31– 1。

Source

树链剖分, LCA

这个题是一个树剖的变形。

对于一个点

1.不被任何副边覆盖。answer+=m;

2.被一条副边覆盖。只能断掉主边,再断掉这条副边,answer++;

3.被多条副边覆盖。不能达到目的.

附:用线段树写可能超时,可以差分记录被覆盖数目。

注意!!!!!!!

*:在跳到同一条重链上时,差分(id[min(deep[x],deep[y])]+1,deep[max(deep[x],deep[y])])

(在最顶端时,非根节点有一条父边连向父亲,不要加);

*:最后统计差分数组时,应当跳过根节点:

#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#define MAXX 1000100
using namespace std;
struct data{
int nxt,to;
}edge[MAXX*2];
int top[MAXX],head[MAXX],hson[MAXX],siz[MAXX],id[MAXX],w[MAXX],fa[MAXX],deep[MAXX];
int n,fr,to,tot,m,sm,ans;
void add(int f,int t){edge[++tot].nxt=head[f],head[f]=tot;edge[tot].to=t;}
void dfs1(int num,int f){
hson[num]=0;siz[num]=1;fa[num]=f;deep[num]=deep[f]+1;
for(int i=head[num];i;i=edge[i].nxt)if(edge[i].to!=f){
int too=edge[i].to;
dfs1(too,num);
siz[num]+=siz[too];
if(siz[hson[num]]<siz[too])hson[num]=too;
}
}
void dfs2(int num,int toop){
top[num]=toop,id[num]=++sm;
if(hson[num])dfs2(hson[num],toop);
for(int i=head[num];i;i=edge[i].nxt)
if(edge[i].to!=hson[num]&&edge[i].to!=fa[num])dfs2(edge[i].to,edge[i].to);
}
void update(int x,int y){w[x]++,w[y+1]--;}
void ask(int x,int y){
while(top[x]!=top[y]){
if(deep[top[x]]<deep[top[y]])swap(x,y);
update(id[top[x]],id[x]);
x=fa[top[x]];
}
if(deep[x]>deep[y])swap(x,y);
if(id[x]+1<=id[y])update(id[x]+1,id[y]);
}
int main(){
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<n;++i)scanf("%d%d",&fr,&to),add(fr,to),add(to,fr);
dfs1(1,0),dfs2(1,1);
for(int i=1;i<=m;++i)scanf("%d%d",&fr,&to),ask(fr,to);
for(int i=2;i<=n;++i)w[i]+=w[i-1];
for(int i=2;i<=n;++i)if(!w[i])ans+=m;else if(!(w[i]-1))ans++;
printf("%d",ans);
return 0;
}

Dark的项链(树链剖分)的更多相关文章

  1. BZOJ 3626: [LNOI2014]LCA [树链剖分 离线|主席树]

    3626: [LNOI2014]LCA Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2050  Solved: 817[Submit][Status ...

  2. BZOJ 1984: 月下“毛景树” [树链剖分 边权]

    1984: 月下“毛景树” Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 1728  Solved: 531[Submit][Status][Discu ...

  3. codevs 1228 苹果树 树链剖分讲解

    题目:codevs 1228 苹果树 链接:http://codevs.cn/problem/1228/ 看了这么多树链剖分的解释,几个小时后总算把树链剖分弄懂了. 树链剖分的功能:快速修改,查询树上 ...

  4. 并查集+树链剖分+线段树 HDOJ 5458 Stability(稳定性)

    题目链接 题意: 有n个点m条边的无向图,有环还有重边,a到b的稳定性的定义是有多少条边,单独删去会使a和b不连通.有两种操作: 1. 删去a到b的一条边 2. 询问a到b的稳定性 思路: 首先删边考 ...

  5. 树链剖分+线段树 CF 593D Happy Tree Party(快乐树聚会)

    题目链接 题意: 有n个点的一棵树,两种操作: 1. a到b的路径上,给一个y,对于路径上每一条边,进行操作,问最后的y: 2. 修改某个条边p的值为c 思路: 链上操作的问题,想树链剖分和LCT,对 ...

  6. 树链剖分+线段树 HDOJ 4897 Little Devil I(小恶魔)

    题目链接 题意: 给定一棵树,每条边有黑白两种颜色,初始都是白色,现在有三种操作: 1 u v:u到v路径(最短)上的边都取成相反的颜色 2 u v:u到v路径上相邻的边都取成相反的颜色(相邻即仅有一 ...

  7. bzoj2243树链剖分+染色段数

    终于做了一道不是一眼出思路的代码题(⊙o⊙) 之前没有接触过这种关于染色段数的题目(其实上课好像讲过),于是百度了一下(现在思维能力好弱) 实际上每一段有用的信息就是总共有几段和两段各是什么颜色,在开 ...

  8. bzoj3631树链剖分

    虽然是水题1A的感觉太爽了O(∩_∩)O~ 题意相当于n-1次树上路径上每个点权值+1,最后问每个点的权值 本来想写线段树,写好了change打算框架打完了再来补,结果打完发现只是区间加和单点查 前缀 ...

  9. BZOJ 3531: [Sdoi2014]旅行 [树链剖分]

    3531: [Sdoi2014]旅行 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1685  Solved: 751[Submit][Status] ...

随机推荐

  1. Linux 用键盘操作窗口

    以下是我从各处搜集来的关于用键盘操作窗口信息,操作可能不是最简或者最好的,当然也可能不是最全的,以后遇到新的操作,我会即使添加,如果你有我没有列出的操作,希望你能提出,我可以加上! 我实验的操作系统是 ...

  2. iOS核心笔记—源代码管理工具-GIT

    源代码管理工具-GIT 一. git 概述 1. git 简介? 什么是git? > git是一款开源的分布式版本控制工具 > 在世界上所有的分布式版本控制工具中,git是最快.最简单.最 ...

  3. 法国总统放大招,用“分身术”竞选总统 全息3d 网

    编辑:大熊 [摘要]法国总统采用全息技术实现"分身"演讲,可谓是一次演讲,全面覆盖! 全息3d网讯:众所周知,欧美国家的总统是通过公开竞选得到的,所以能更直接.更广泛的近距离接触民 ...

  4. 简学Python第一章__进入PY的世界

    #cnblogs_post_body h2 { background: linear-gradient(to bottom, #18c0ff 0%,#0c7eff 100%); color: #fff ...

  5. [Android ADB] An auto-input method for Android and Windows

    The Valentine's Day is coming. Here is an auto-input method and you may use it to send multiple word ...

  6. MySql学习(七) —— 查询性能优化 深入理解MySql如何执行查询

    本篇深入了解查询优化和服务器的内部机制,了解MySql如何执行特定查询,从中也可以知道如何更改查询执行计划,当我们深入理解MySql如何真正地执行查询,明白高效和低效的真正含义,在实际应用中就能扬长避 ...

  7. 对await(),notify()的理解

    await(),notify()是java Object类的方法.在两个线程同时访问一个对象的时候可以利用这2个方法实现线程的通信.看下面的例子. public class Account { pri ...

  8. UWP: ListView 中与滚动有关的两个需求的实现

    在 App 的开发过程中,ListView 控件是比较常用的控件之一.掌握它的用法,能帮助我们在一定程度上提高开发效率.本文将会介绍 ListView 的一种用法--获取并设置 ListView 的滚 ...

  9. lamp论坛搭建

    1.配置本地yum源   mount 2.安装软件 yum install httpd mariadb mariadb-server   php php-mysql php-gd libjpeg*   ...

  10. LINQ中,Single()、SingleOrDefault()的解析、示例

    LINQ一般查询到的结果是IEnumerable<T>集合类型,想要从中取出单一的元素,可以使用Single.First.Last.ElementAt等方法,以及它们带有OrDefault ...