题目链接:【http://acm.hdu.edu.cn/showproblem.php?pid=6203】

题意  :给出一棵树,如果(a,b)路径上有坏点,那么(a,b)之间不联通,给出一些不联通的点对,然后判断最少有多少个坏点。

题解  :求每个点对的LCA,然后根据LCA的深度排序。从LCA最深的点对开始,如果a或者b点已经有点被标记了,那么continue,否者标记(a,b)LCA的子树每个顶点加1。

#include<Bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
int N, Q;
int c[maxn], In[maxn], Out[maxn], cnt;
struct Edge
{
int id, next;
Edge(int id = 0, int next = 0): id(id), next(next) {}
} E[maxn << 1]; //双向边
int head[maxn], tot;
void initEdge()
{
memset(c, 0, sizeof(c));
cnt = 0;
for(int i = 0; i <= N; i++) head[i] = -1;
tot = 0;
}
void addEdge(int u, int v)
{
E[tot] = Edge(v, head[u]);
head[u] = tot++;
}
int siz[maxn], top[maxn], dep[maxn], fa[maxn];
int clk;//需要初始化
void DFS1(int u, int p)
{
In[u] = ++cnt;
dep[u] = dep[p] + 1;
fa[u] = p, siz[u] = 1;
for(int k = head[u]; k != -1; k = E[k].next)
{
int id = E[k].id;
if(id == p) continue;
DFS1(id, u);
siz[u] += siz[id];
}
Out[u] = cnt;
}
void DFS2(int u, int p)
{
int son = -1;
for(int k = head[u]; k != -1; k = E[k].next)//找重儿子
{
int id = E[k].id;
if(id == p)continue;
if(son == -1 || siz[id] > siz[son]) son = id;
}
if(son != -1)
{
top[son] = top[u];
DFS2(son, u);
}
for(int k = head[u]; k != -1; k = E[k].next)
{
int id = E[k].id;
if(id == p || id == son)continue;
top[id] = id;
DFS2(id, u);
}
}
int LCA(int x, int y)
{
while(top[x] != top[y])
{
if(dep[top[x]] < dep[top[y]]) swap(x, y);
x = fa[top[x]];
}
if(dep[x] > dep[y]) swap(x, y);
return x;
} struct node
{
int u, v, lca;
bool operator < (const node &T) const
{
return dep[lca] > dep[T.lca];
}
} qry[50050];
int low_Bit(int x)
{
return x & -x;
}
void update(int x, int val)
{
while(x <= N)
{
c[x] += val;
x += low_Bit(x);
}
}
int get_sum(int x)
{
int ret = 0;
while(x > 0)
{
ret += c[x];
x -= low_Bit(x);
}
return ret;
}
int main()
{
while(~scanf("%d", &N))
{
N++;
initEdge();
for(int i = 1; i <= N - 1; i++)
{
int u, v;
scanf("%d %d", &u, &v);
u++, v++;
addEdge(u, v), addEdge(v, u);
}
DFS1(1, 0),top[1] = 1,DFS2(1, 0);
scanf("%d", &Q);
for(int i = 1; i <= Q; i++)
{
scanf("%d %d", &qry[i].u, &qry[i].v);
qry[i].u++, qry[i].v++;
qry[i].lca = LCA(qry[i].u, qry[i].v);
}
sort(qry + 1, qry + 1 + Q);
int ans = 0;
for(int i = 1; i <= Q; i++)
{
int u = qry[i].lca;
int ret = get_sum(In[qry[i].u]) + get_sum(In[qry[i].v]);
if(ret) continue;
ans++;
update(In[u], 1);
update(Out[u] + 1, -1);
}
printf("%d\n", ans);
}
return 0;
}

  

HDU 6203 ping ping ping [LCA,贪心,DFS序,BIT(树状数组)]的更多相关文章

  1. BZOJ 2819: Nim dfs序维护树状数组,倍增

    1.随机选两个堆v,u,询问若在v到u间的路径上的石子堆中玩Nim游戏,是否有必胜策略,如果有,vfleaking将会考虑将这些石子堆作为初始局面之一,用来坑玩家.2.把堆v中的石子数变为k. 分析: ...

  2. 【Tyvj2133&BZOJ1146】网络管理Network(树套树,DFS序,树状数组,主席树,树上差分)

    题意:有一棵N个点的树,每个点有一个点权a[i],要求在线实现以下操作: 1:将X号点的点权修改为Y 2:查询X到Y的路径上第K大的点权 n,q<=80000 a[i]<=10^8 思路: ...

  3. 【BZOJ1103】大都市meg(DFS序,树状数组)

    题意:有一颗树,1号点为根,保证编号小的点深度较小,初始状态每条边都没有被标记,要求实现两个操作在线: A:将连接x,y的边标记 W:查询从1到x的路径上有多少条边未被标记 n<=2*10^5 ...

  4. BZOJ 1103: [POI2007]大都市meg(dfs序,树状数组)

    本来还想链剖的,结果才发现能直接树状数组的= = 记录遍历到达点与退出点的时间,然后一开始每个到达时间+1,退出时间-1,置为公路就-1,+1,询问直接点1到该点到达时间求和就行了- - CODE: ...

  5. 2018.06.30 BZOJ4765: 普通计算姬(dfs序+分块+树状数组)

    4765: 普通计算姬 Time Limit: 30 Sec Memory Limit: 256 MB Description "奋战三星期,造台计算机".小G响应号召,花了三小时 ...

  6. 【POJ3321】Apple Tree(DFS序,树状数组)

    题意:给一棵n个节点的树,每个节点开始有一个苹果,m次操作 1.将某个结点的苹果数异或 1 2.查询一棵子树内的苹果数 n,m<=100000   思路:最近一段时间在思考树上统计问题的算法 发 ...

  7. BZOJ 4765 普通计算姬 dfs序+分块+树状数组+好题!!!

    真是道好题...感到灵魂的升华... 按dfs序建树状数组,拿前缀和去求解散块: 按点的标号分块,分成一个个区间,记录区间子树和 的 总和... 具体地,需要记录每个点u修改后,对每一个块i的贡献,记 ...

  8. HDOJ5877(dfs序+离散化+树状数组)

    Weak Pair Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  9. Apple Tree POJ - 3321 dfs序列构造树状数组(好题)

    There is an apple tree outside of kaka's house. Every autumn, a lot of apples will grow in the tree. ...

  10. 【bzoj3252】攻略 贪心+DFS序+线段树

    题目描述 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏. 今天他得到了一款新游戏<XX半岛>,这款游戏有n个场景(scene),某 ...

随机推荐

  1. AlloyTouch 简介

    AlloyTouch 是来自于腾讯AlloyTeam团队开发的一个适用用移动端的js组件库. 特性: 1.丰富的组件 选择组件.级联选择组件.轮播组件.全屏滚动组件.下拉刷新组件.上拉刷新任君选择 2 ...

  2. Delphi 常用数据类型 字符串类型 数据类型等等

    字符串类型 Delphi有三种类型的字符: ●AnsiChar这是标准的1字节的ANSI字符,程序员都对它比较熟悉. ●WideChar这是2字节的Unicode字符. ●Char在目前Delphi早 ...

  3. Win7下SQLPlus登录时报错"SP2-1503:无法初始化Oracle调用界面"

    Oracle安装完毕,使用SQLPlus登录的时候报错"SP2-1503:无法初始化Oracle调用界面",然后一闪界面关闭,报错界面如下: 这个是因为在Win7需要管理员权限,右 ...

  4. windows程序设计.第一个windos程序

    Windows程序设计(第5版) windows程序需要调用API. 第一个Windows程序 /*HelloMsg.c -- Displays "Hello World!" in ...

  5. python作业Select版本FTP(第十周)

    SELECT版FTP: 使用SELECT或SELECTORS模块实现并发简单版FTP 允许多用户并发上传下载文件 思路解析: 1. 使用IO多路复用的知识使用SELECTORS封装好的SELECTOR ...

  6. weblogic 配置了ssl

    jingyan.baidu.com/article/72ee561abfe531e16138dfb5.html http://blog.sina.com.cn/s/blog_7ffec3e201019 ...

  7. cookie 跨域的问题

    今天研究一天发现cookie无法设置除当前域名或者其父域名之外的其他domain. 这个是浏览器出于对cookie的保护造成的,也就是cookie无法跨域设置. 对于子域名也有如下规则,当前域名只能设 ...

  8. Python中如何Debug

    debug是编码是非常重要的调试技巧,通过在运行过程中设置断点,帮助开发人员更好的理解运行过程. Python中debug不像JAVA或者C++那样在IDE中设置断点那么直观. Python的debu ...

  9. ubuntu查看mysql版本的几种方法

    ubuntu查看mysql版本的几种方法 mysql 1:在终端下:mysql -V(大写) //代码 $ mysql -V mysql Ver 14.14 Distrib 5.5.46, for d ...

  10. webservice使用

    soap方法 一:PHP本身的SOAP 所有的webservice都包括服务端(server)和客户端(client). 要使用php本身的soap首先要把该拓展安装好并且启用.下面看具体的code ...