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),某 ...
随机推荐
- 响应式布局(Responsive Layout)/流式布局(Fluid Layout)/自适应布局(Adaptive)
1.使用媒体查询来适应不同视口的固定宽度设计,例如bootstrap的container类. 2.将固定像素布局转换成灵活的百分比布局,才能让页面元素根据视口大小在一个又一个媒体查询间伸缩修正样式. ...
- Goolge-Guava Concurrent中的Service
最近在学习了下Google的Guava包,发现这真是一个好东西啊..由于平时也会写一些基于多线程的东西,所以特意了解了下这个Service框架.这里Guava包里的Service接口用于封装一个服务对 ...
- spring 添加controller返回值绑定
@EnableWebMvc @Configuration public class Config { @Autowired private RequestMappingHandlerAdapter h ...
- c语言中使用自带的qsort(结构体排序)+ 快排
c中没有自带的sort函数emm 不过有自带的qsort函数 (其实用法都差不多(只是我经常以为c中有sort 头文件要用 #include <stdlib.h> 一定要重新把指针指向的值 ...
- D - Frog and Portal (利用斐波那契数列的性质)
题目链接:https://cn.vjudge.net/contest/270201#problem/D 具体思路:利用斐波那契数列的性质,斐波那契数列可以构成任何正整数,所以按照顺序减下去肯定能减到0 ...
- 使用SPLUNK进行简单Threat Hunting
通过订阅网上公开的恶意ip库(威胁情报),与SIEM平台中网络流量日志进行匹配,获得安全事件告警. 比如,这里有一个malware urls数据下载的网站,每天更新一次: https://urlhau ...
- Codeforces 870E Points, Lines and Ready-made Titles 计数
题目链接 题意 给定二维坐标上的\(n\)个点,过每个点可以 画一条水平线 或 画一条竖直线 或 什么都不画,并且若干条重合的直线被看做同一条.问共可能得到多少幅不同的画面? 题解 官方题解 仆の瞎扯 ...
- 11.Container With Most Water---两指针
题目链接:https://leetcode.com/problems/container-with-most-water/description/ 题目大意:给出一串数组(a1, a2, a3, .. ...
- Android Debug Bridge (adb) device - no permissions
I have a problem connecting HTC Wildfire A3333 in debugging mode with my Fedora Linux 17. Adb says ...
- 利用Fidder工具抓取App数据包
第一步:下载神器Fiddler,下载链接: http://fiddler2.com/get-fiddler 下载完成之后,傻瓜式的安装一下了! 第二步:设置Fiddler打开Fiddler, ...