HDU 6203 2017沈阳网络赛 LCA,DFS+树状数组
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6203
题意:n+1 个点 n 条边的树(点标号 0 ~ n),有若干个点无法通行,导致 p 组 U V 无法连通。问无法通行的点最少有多少个。
解法:按照询问的LCA深度排序,然后顺序标记每个询问的LCA。根据所给的树(任意点为根)预处理出每个点的前序 DFS 序和后序 DFS 序(需统一标号),及点的深度。根据 p 组 U V 处理每组两点的 LCA 。压入优先队列(LCA 深度大的点优先出队)。对于出队的 U V 及其对应的 LCA ,判断点 U 或点 V 是否在之前已禁止的某点的子树中,对于某点U如果在禁止通行的点P的子树中,则L[P]<=L[U]<=R[U]<=R[P]一定成立。所以可以利用树状数组区间更新单点查询,对于每个禁止通行点标记区间L[P],R[P]的所有节点。查询的时候如果L[U]被标记,说明U,V已经被隔断。
- #include <bits/stdc++.h>
- using namespace std;
- const int maxn = 20100;
- typedef long long LL;
- vector <int> G[maxn];
- int n, m, dfsclk, c[maxn], fa[maxn][21], dep[maxn], L[maxn], R[maxn];
- bool vis[maxn];
- struct node{
- int u,v,uv;
- node(){}
- node(int u,int v,int uv):u(u),v(v),uv(uv){}
- bool operator<(const node &rhs)const{
- return dep[uv]<dep[rhs.uv];
- }
- };
- void dfs(int x){
- vis[x]=1;
- L[x]=++dfsclk;
- for(int i=0; i<G[x].size(); i++){
- int v=G[x][i];
- if(!vis[v]){
- dep[v]=dep[x]+1;
- fa[v][0]=x;
- dfs(v);
- }
- }
- R[x]=++dfsclk;
- }
- void init(){
- for(int j=1; j<=20; j++)
- for(int i=1; i<=n; i++)
- fa[i][j] = fa[fa[i][j-1]][j-1];
- }
- int LCA(int u, int v){
- if(dep[u]<dep[v]) swap(u,v);
- for(int i=20; i>=0; i--){
- if((dep[u]-dep[v])&(1<<i))
- u=fa[u][i];
- }
- if(u==v) return u;
- for(int i=20; i>=0; i--){
- if(fa[u][i]!=fa[v][i]){
- u=fa[u][i];
- v=fa[v][i];
- }
- }
- return fa[u][0];
- }
- int lowbit(int x){
- return x&(-x);
- }
- void add(int x, int v){
- while(x<maxn){
- c[x]+=v;
- x+=lowbit(x);
- }
- }
- void update(int x, int y, int z){
- add(x, z);
- add(y+1, -z);
- }
- int query(int x){
- int ret=0;
- while(x>0){
- ret+=c[x];
- x-=lowbit(x);
- }
- return ret;
- }
- int main()
- {
- while(~scanf("%d", &n))
- {
- memset(c, 0, sizeof(c));
- memset(vis, 0, sizeof(vis));
- memset(dep, 0, sizeof(dep));
- for(int i=0; i<=n+1; i++) G[i].clear();
- for(int i=1; i<=n; i++){
- int u,v;
- scanf("%d %d", &u,&v);
- u++,v++;
- G[u].push_back(v);
- G[v].push_back(u);
- }
- n++;
- dfsclk = 0;
- dfs(1);
- init();
- priority_queue <node> q;
- scanf("%d", &m);
- while(m--){
- int u, v;
- scanf("%d %d", &u,&v);
- u++;
- v++;
- int uv = LCA(u, v);
- q.push(node(u,v,uv));
- }
- int ans=0;
- while(!q.empty()){
- node now = q.top();
- q.pop();
- int flag = query(L[now.u])+query(L[now.v]);
- if(flag==0){
- ans++;
- update(L[now.uv],R[now.uv],1);
- }
- }
- printf("%d\n", ans);
- }
- return 0;
- }
HDU 6203 2017沈阳网络赛 LCA,DFS+树状数组的更多相关文章
- HDU 5877 2016大连网络赛 Weak Pair(树状数组,线段树,动态开点,启发式合并,可持久化线段树)
Weak Pair Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Tota ...
- HDU - 6393 Traffic Network in Numazu (LCA+RMQ+树状数组)
这道题相当于将这两题结合: http://poj.org/problem?id=2763 http://codeforces.com/gym/101808/problem/K 题意:有N各点N条边的带 ...
- HDU 6201 2017沈阳网络赛 树形DP或者SPFA最长路
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6201 题意:给出一棵树,每个点有一个权值,代表商品的售价,树上每一条边上也有一个权值,代表从这条边经过 ...
- HDU 6200 2017沈阳网络赛 树上区间更新,求和
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6200 题意:给个图,有2种操作,一种是加一条无向边,二是查询u,v之间必须有的边的条数,所谓必须有的边 ...
- HDU 6199 2017沈阳网络赛 DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6199 题意:n堆石子,Alice和Bob来做游戏,一个人选择取K堆那么另外一个人就必须取k堆或者k+1 ...
- HDU 6205 2017沈阳网络赛 思维题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6205 题意:给你n堆牌,原本每一堆的所有牌(a[i]张)默认向下,每次从第一堆开始,将固定个数的牌(b ...
- HDU 6198 2017沈阳网络赛 线形递推
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6198 题意:给出一个数k,问用k个斐波那契数相加,得不到的数最小是几. 解法:先暴力打表看看有没有规律 ...
- HDU 6195 2017沈阳网络赛 公式
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6195 题意:有M个格子,有K个物品.我们希望在格子与物品之间连数量尽可能少的边,使得——不论是选出M个 ...
- Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分)
Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分) Description L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之 ...
随机推荐
- 【BZOJ 3652】大新闻 数位dp+期望概率dp
并不难,只是和期望概率dp结合了一下.稍作推断就可以发现加密与不加密是两个互相独立的问题,这个时候我们分开算就好了.对于加密,我们按位统计和就好了;对于不加密,我们先假设所有数都找到了他能找到的最好的 ...
- 一些$LCT$的瓜皮题目
一些瓜皮 放几个比较优(she)秀(pi)的\(LCT\)题. 老惯例,每一题代码因为一些未知原因消失了(如果要的话私我好了,虽然会咕咕咕). 嘴巴\(AC\)真香! [SP16580] QTREE7 ...
- Jump Game - LeetCode
目录 题目链接 注意点 解法 小结 题目链接 Jump Game - LeetCode 注意点 解法 解法一:贪心算法,只关注能到达最远距离,如果能到达的最远距离大于结尾说明能到达,否则不能.并且如果 ...
- BZOJ3522 [Poi2014]Hotel 【树形dp】
题目链接 BZOJ3522 题解 就是询问每个点来自不同子树离它等距的三个点的个数 数据支持\(O(n^2)\),可以对每个距离分开做 设\(f[i][j]\)表示\(i\)的子树中到\(i\)距离为 ...
- 洛谷 P1341 无序字母对 解题报告
P1341 无序字母对 题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 ...
- 【bzoj3122】 Sdoi2013—随机数生成器
http://www.lydsy.com/JudgeOnline/problem.php?id=3122 (题目链接) 题意 对于一个数列${X_i}$,其递推式为:${X_{i+1}=(a*X_i+ ...
- 使用regsrv32.exe绕过应用程序白名单(多种方法)
0x00 regsvr简介 regsvr32表示Microsoft注册服务.它是Windows的命令行实用工具.虽然regsvr32有时会导致问题出现,但它是Windows系统文件中的一个重要文件.该 ...
- 20165218 《网络对抗技术》Exp3 免杀原理与实践
Exp3 免杀原理与实践 任务一:正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,自己利用shellcode编程等免杀工具或技巧 使用VirusTotal或 ...
- 解题:NOI 2016 优秀的拆分
题面 其实题目不算很难,但是我调试的时候被玄学了,for循环里不写空格会RE,写了才能过.神**调了一个多小时是这么个不知道是什么的玩意(真事,可以问i207M=.=),心态爆炸 发现我们只要找AA或 ...
- LGP4588[JSOI2018]扫地机器人
题解 需要先说明一点东西: 1 同一副对角线方向相同,共有$gcd(n,m)$条不同的副对角线,机器人的行为是一个$gcd(n,m)$的循环:: 如果左上方是$(1,1)$,容易看出所有的路径是从左或 ...