HDU 6203 ping ping ping [LCA,贪心,DFS序,BIT(树状数组)]
题目链接:【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(树状数组)]的更多相关文章
- BZOJ 2819: Nim dfs序维护树状数组,倍增
1.随机选两个堆v,u,询问若在v到u间的路径上的石子堆中玩Nim游戏,是否有必胜策略,如果有,vfleaking将会考虑将这些石子堆作为初始局面之一,用来坑玩家.2.把堆v中的石子数变为k. 分析: ...
- 【Tyvj2133&BZOJ1146】网络管理Network(树套树,DFS序,树状数组,主席树,树上差分)
题意:有一棵N个点的树,每个点有一个点权a[i],要求在线实现以下操作: 1:将X号点的点权修改为Y 2:查询X到Y的路径上第K大的点权 n,q<=80000 a[i]<=10^8 思路: ...
- 【BZOJ1103】大都市meg(DFS序,树状数组)
题意:有一颗树,1号点为根,保证编号小的点深度较小,初始状态每条边都没有被标记,要求实现两个操作在线: A:将连接x,y的边标记 W:查询从1到x的路径上有多少条边未被标记 n<=2*10^5 ...
- BZOJ 1103: [POI2007]大都市meg(dfs序,树状数组)
本来还想链剖的,结果才发现能直接树状数组的= = 记录遍历到达点与退出点的时间,然后一开始每个到达时间+1,退出时间-1,置为公路就-1,+1,询问直接点1到该点到达时间求和就行了- - CODE: ...
- 2018.06.30 BZOJ4765: 普通计算姬(dfs序+分块+树状数组)
4765: 普通计算姬 Time Limit: 30 Sec Memory Limit: 256 MB Description "奋战三星期,造台计算机".小G响应号召,花了三小时 ...
- 【POJ3321】Apple Tree(DFS序,树状数组)
题意:给一棵n个节点的树,每个节点开始有一个苹果,m次操作 1.将某个结点的苹果数异或 1 2.查询一棵子树内的苹果数 n,m<=100000 思路:最近一段时间在思考树上统计问题的算法 发 ...
- BZOJ 4765 普通计算姬 dfs序+分块+树状数组+好题!!!
真是道好题...感到灵魂的升华... 按dfs序建树状数组,拿前缀和去求解散块: 按点的标号分块,分成一个个区间,记录区间子树和 的 总和... 具体地,需要记录每个点u修改后,对每一个块i的贡献,记 ...
- HDOJ5877(dfs序+离散化+树状数组)
Weak Pair Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
- 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. ...
- 【bzoj3252】攻略 贪心+DFS序+线段树
题目描述 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏. 今天他得到了一款新游戏<XX半岛>,这款游戏有n个场景(scene),某 ...
随机推荐
- 前端观察:HTML5做得好,收入不比 iOS 差
谷歌奋进的绿色机器人超过了苹果的市场占有率,这一市场现象,导致了愈来愈多的开发者转投html5的怀抱.而HTML5将成为开发者拥抱同时拥抱Android和IOS的不二法门. 根据著名移动生态系统分析公 ...
- 使用asp.net改变图片颜色
最近奇葩经理提出了奇葩的需求,要能在网站上改变图片的颜色,比如灰色的变成彩色,彩色的变成灰色,尼玛楼主的感受你们不懂!于是有了下面的代码... 用法:调用update_pixelColor方法并传参数 ...
- CodeForces - 1004B
Sonya decided to organize an exhibition of flowers. Since the girl likes only roses and lilies, she ...
- python基础===数据伪造模块faker
介绍文档: https://pypi.org/project/Faker/ https://faker.readthedocs.io/en/latest/ https://faker.readthed ...
- fsarchiver创建系统镜像(dd命令也可以)
fsarchiver简介 fsarchiver可以将整个文件系统的内容保存成一个压缩形式的归档文件,包含文件系统本身.所以用来做系统镜像是一个不错的选择,一旦系统崩溃但可以进入救援模式,我们就可以使用 ...
- 正排索引(forward index)与倒排索引(inverted index) (转)
一.正排索引(前向索引) 正排索引也称为"前向索引".它是创建倒排索引的基础,具有以下字段. (1)LocalId字段(表中简称"Lid"):表示一个文档的局部 ...
- WordPress用户角色与用户能力/权限
WordPress用户角色(user roles)是WP或者其它插件增加的,可以让网站管理员(网站管理员也是一种角色)来方便的管理用户的权限/能力(Capabilities,一般情况下,一种角色不止有 ...
- [你必须知道的.NET]第二十四回:认识元数据和IL(上)
发布日期:2009.02.24 作者:Anytao © 2009 Anytao.com ,Anytao原创作品,转贴请注明作者和出处. 说在,开篇之前 很早就有说说Metadata(元数据)和IL(中 ...
- Netty性能调优
1. 减少内存allocation和deallocation.通过静态实例和内存缓存,减少IO的次数. 2. 使用gather write和scatter read 3. 使用jDK7,因为他的byt ...
- [笔记]用gdb调试core dump
总是隔一段时间才写一次C++,有些东西老是用完就忘了……记一下如何用gdb来调试core dump免得到时候又忘记. 首先需要设置core file的大小,默认是0所以不设不会生成core file ...