Gym 101142G : Gangsters in Central City(DFS序+LCA+set)
题意:现在有一棵树,1号节点是水源,叶子节点是村庄,现在有些怪兽会占领一些村庄(即只占领叶子节点),现在要割去一些边,使得怪兽到不了水源。给出怪兽占领和离开的情况,现在要割每次回答最小的割,使得怪兽不与1号节点有联系,而且满足被阻隔的村庄最少。输出最小割与组少的被误伤的村庄。
思路:把与一号节点相邻的点看作祖先gfa,然后它们自己作为树的根节点,根节点保存了子树里叶子节点的个数。很显然一棵树我们要割的是这棵树里所有怪兽的LCA与父亲边。子数里所有怪兽的LCA=LCA(最小DFS序的怪兽点,最大DFS序的怪兽点),用set维护有序关系即可。
#include<bits/stdc++.h>
using namespace std;
const int maxn=;
vector<int>G[maxn]; set<int>S[maxn];
int dfn[maxn],pos[maxn],fa[maxn][],gfa[maxn],dep[maxn];
int sz[maxn],son[maxn],cut[maxn],num[maxn],times;
void dfs(int u,int f,int two)
{
dfn[u]=++times; pos[times]=u; dep[u]=dep[f]+;
if(dep[u]==) two=u; if(two) gfa[u]=two;
for(int i=;i<G[u].size();i++)
if(G[u][i]!=f)
dfs(G[u][i],u,two),son[u]+=sz[G[u][i]];
if(!son[u]) sz[u]=;
else sz[u]=son[u];
}
int LCA(int u,int v){
if(dep[u]<dep[v]) swap(u,v);
for(int i=;i>=;i--) if(dep[fa[u][i]]>=dep[v]) u=fa[u][i];
if(u==v) return u;
for(int i=;i>=;i--) if(fa[u][i]!=fa[v][i]) u=fa[u][i],v=fa[v][i];
return fa[u][];
}
int ans1,ans2; int tmp[maxn];
int main()
{
freopen("gangsters.in","r",stdin);
freopen("gangsters.out","w",stdout);
int N,Q,i,j;
scanf("%d%d",&N,&Q);
for(i=;i<=N;i++){
scanf("%d",&fa[i][]);
G[fa[i][]].push_back(i);
}
for(i=;i<=;i++)
for(j=;j<=N;j++)
fa[j][i]=fa[fa[j][i-]][i-];
dfs(,,);
char opt[]; int x;
while(Q--){
scanf("%s%d",opt+,&x);
int t=gfa[x];
if(opt[]=='+'){
if(S[t].empty()) ans1++;
else ans2-=tmp[t];
S[t].insert(dfn[x]);
int Lca=LCA(pos[*S[t].begin()],pos[*S[t].rbegin()]);
cut[t]=Lca; num[t]++;
tmp[t]=(sz[cut[t]]-num[t]);
ans2+=tmp[t];
}
else {
ans2-=tmp[t]; tmp[t]=;
S[t].erase(dfn[x]); num[t]--;
if(S[t].empty()) ans1--,cut[t]=;
else {
int Lca=LCA(pos[*S[t].begin()],pos[*S[t].rbegin()]);
cut[t]=Lca; tmp[t]=(sz[cut[t]]-num[t]);
ans2+=tmp[t];
}
}
printf("%d %d\n",ans1,ans2);
}
return ;
}
Gym 101142G : Gangsters in Central City(DFS序+LCA+set)的更多相关文章
- 2016 NEERC, Northern Subregional Contest G.Gangsters in Central City(LCA)
G.Gangsters in Central City 题意:一棵树,节点1为根,是水源.水顺着边流至叶子.该树的每个叶子上有房子.有q个询问,一种为房子u被强盗入侵,另一种为强盗撤离房子u.对于每个 ...
- Codeforces Gym 101142 G Gangsters in Central City (lca+dfs序+树状数组+set)
题意: 树的根节点为水源,编号为 1 .给定编号为 2, 3, 4, …, n 的点的父节点.已知只有叶子节点都是房子. 有 q 个操作,每个操作可以是下列两者之一: + v ,表示编号为 v 的房子 ...
- G. Gangsters in Central City
给出一棵$1$为根节点的含$n$个节点的树,叶子节点都是房屋,在一个集合里面添加房屋和移除房屋. 每一次添加和移除后,回答下面两个问题. 1. 使得已选房屋都不能从根节点到达,最少需要砍多少条边. ...
- Gym101142G Gangsters in Central City
题目链接:https://cn.vjudge.net/problem/Gym-101142G 知识点: DFS序.LCA 题目大意: 给定一棵有根树(根为 \(1\)).每次修改叶子节点会被染成黑色( ...
- BZOJ 3083: 遥远的国度 [树链剖分 DFS序 LCA]
3083: 遥远的国度 Time Limit: 10 Sec Memory Limit: 1280 MBSubmit: 3127 Solved: 795[Submit][Status][Discu ...
- HDU 3966 dfs序+LCA+树状数组
题目意思很明白: 给你一棵有n个节点的树,对树有下列操作: I c1 c2 k 意思是把从c1节点到c2节点路径上的点权值加上k D c1 c2 k 意思是把从c1节点到c2节点路径上的点权值减去k ...
- bzoj2819 DFS序 + LCA + 线段树
https://www.lydsy.com/JudgeOnline/problem.php?id=2819 题意:树上单点修改及区间异或和查询. 思维难度不高,但是题比较硬核. 整体思路是维护每一个结 ...
- 蓝皮书:异象石 【dfs序+lca】
题目详见蓝皮书[算法竞赛:进阶指南]. 题目大意: 就是给你一颗树,然后我们要在上面进行三种操作: 1.标记某个点 或者 2.撤销某个点的标记 以及 3.询问标记点在树上连通所需的最短总边 ...
- HDU 6203 ping ping ping(dfs序+LCA+树状数组)
http://acm.hdu.edu.cn/showproblem.php?pid=6203 题意: n+1 个点 n 条边的树(点标号 0 ~ n),有若干个点无法通行,导致 p 组 U V 无法连 ...
随机推荐
- 1065. [Nescafe19] 绿豆蛙的归宿(概率)
1065. [Nescafe19] 绿豆蛙的归宿 ★ 输入文件:ldfrog.in 输出文件:ldfrog.out 简单对比时间限制:1 s 内存限制:128 MB [背景] 随着新版 ...
- 最简单的php验证码
<?php session_start(); // Settings: You can customize the captcha here $image_width = 120; $image ...
- can not find java.util.map java.lang.Double问题
mybatis @Param注解和ParamType属性不能共存
- 我的Android进阶之旅------>关于调用Webservice查询火车票时刻表的几个接口介绍
今天发现一个可以提供火车票时刻表查询的WebService,先记录下来以后如果写一个火车票时刻表查询的Android App的话就用的着.首先该WebService的的名字是TrainTimeWebS ...
- postgres=# psql -U postgres -h 127.0.0.1 -p 5432 -d dreamstart_dev -w
postgres=# psql -U postgres -h 127.0.0.1 -p 5432 -d dreamstart_dev -wpostgres-# \dNo relations found ...
- Django与Vue语法冲突问题完美解决方法
当我们在django web框架中,使用vue的时候,会遇到语法冲突. 因为vue使用{{}},而django也使用{{}},因此会冲突. 解决办法1: 在django1.5以后,加入了标签: {% ...
- Sqoop架构以及应用介绍
本篇文章在具体介绍Sqoop之前,先给大家用一个流程图介绍Hadoop业务的开发流程以及Sqoop在业务当中的实际地位. 如上图所示:在实际的业务当中,我们首先对原始数据集通过MapReduce进行 ...
- linux中什么是文件结构体?
struct file结构体定义在include/linux/fs.h中定义.文件结构体代表一个打开的文件,系统中的每个打开的文件在内核空间都有一个关联的 struct file.它由内核在打开文件时 ...
- P4619 [SDOI2018]旧试题
题目 P4619 [SDOI2018]旧试题 Ps:山东的题目可真(du)好(liu),思维+码量的神仙题 推式 求\(\sum_{i=1}^A\sum_{j=1}^B\sum_{k=1}^Cd(ij ...
- css3图片过滤效果
在线演示 本地下载