来源:牛客网

文章目录

  • 题目描述
  • 题解:
  • 代码:
时间限制:C/C++ 5秒,其他语言10秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

树国是一个有n个城市的国家,城市编号为1∼n。连接这些城市的道路网络形如一棵树,
即任意两个城市之间有恰好一条路径。城市中有k个帮派,编号为1∼k。每个帮派会占据一些城市,以进行非法交易。有时帮派之间会结盟,这就使得城市更加不安全了。同一座城市中可能有多个帮派。
当一些帮派结成联盟时,他们会更加强大,同时也更加危险。他们所控制的城市数会显著增加。具体地,一个联盟控制的城市是联盟中所有帮派所占据的城市,再加上这些城市两两之间路径上的所有城市。
shy是树国的市长,他想要选择一个城市作为首都。在决定之前,他要先做一些调研。为此,他找来你帮他回答一些询问,你能做到吗?在每个询问中,shy会选择一个城市作为首都,同时会告诉你当前活跃的帮派的集合。在这个询问中,你只需要考虑给定的集合中的帮派,其他的帮派你可以当作不存在。已知给定集合中的这些帮派结成了联盟,shy希望抓获联盟中的人,以得到关于整个联盟的一些信息。为此,他要找到被联盟控制的所有城市中离首都最近的一座城市到首都的距离。有可能首都本身就被控制了,此时答案为0。请注意,询问之间相互独立,互不影响。

输入描述:

输入的第一行包含一个整数n,代表树国中的城市数。 接下来n−1行,每行包含两个整数u和v,代表城市u和v之间存在一条道路。
接下来一行包含一个整数k,代表树国中的帮派数。
接下来k行,每行描述一个帮派。第i行的第一个整数c[i]代表第i个帮派占据的城市数,接下来c[i]个整数,代表被第i个帮派占据的城市。
接下来一行包含一个整数Q,代表询问数。
接下来Q行,每行描述一个询问。每行的前两个整数V和t[i]代表本次询问中的首都与需要考虑的帮派集合的大小。接下来t[i]个整数代表本次询问中需要考虑的帮派。.

输出描述:

对于每个询问,输出一行,包含一个整数,代表询问的答案。

示例1
输入

7
1 2
1 3
2 4
2 5
3 6
3 7
2
2 6 7
1 4
3
5 1 2
1 1 1
5 2 1 2

输出

2
1
1

备注:

对于30%的数据,1≤n,k,Q≤1000, 1≤每个帮派占据城市数之和≤1000, 1≤每个询问中考虑的帮派数之和≤1000

对于60%的数据,1≤n,k,Q≤100000, 1≤每个帮派占据城市数之和≤100000, 1≤每个询问中考虑的帮派数之和≤100000

对于100%的数据,1≤n,k,Q≤500000, 1≤每个帮派占据城市数之和≤500000, 1≤每个询问中考虑的帮派数之和≤500000

题解:

第一反应lca,最近好多lca的题
题目本质就是求一个点(即题目中的首都)到lca(x,y)上的点(即被控制的城市)的最短路径
被控制的城市其实就形成了一个子树
分情况讨论:
1.城市不在被控制的子树里面(如图)
紫色是城市,橙色是被控制子树,那距离就是首都到子树的距离
sum=dep[首都]+dep[lca(城市x)]-dep[lca(城市x,首都)]
城市x就是lca(x,y)的值(x和y就是题目所给的帮派)

2.首都被控制
首都被控制分为直接控制(帮派点为首都)
或间接控制(首都在帮派之间的线路上)
那距离就是0


3.首都没被控制,但是首都在被控制的子树中
(首都的前驱被控制,后继没被控制)
对于这种情况我们就要找首都的的前驱后继点,这样好判断距离
可以用dfs序,因为dfs序就保存着各个点的顺序
然后可以用二分来降低复杂度
如果首都到LCA的路径上存在一个点x(x被占领),x!=lca,那么答案就是首都到最近一个符合这个条件的点

lca详细讲解
dfs序详细讲解
为什么这些知识点我都会,但是我就不会做题。。哭o(╥﹏╥)o

代码:

写完再加上。。。(最近有点懒)


好吧我放弃了,写完一直改,一直wa,难受自闭了
借鉴的大佬的代码

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAX_N=1e6+20;
const int DEG=20;
const int INF=0x3f3f3f3f;
const LL MOD=1e9+7;
int T;
int N;
//链式前向星村边
int head[MAX_N],tot;
struct Edge{int to,nxt;
}edge[MAX_N*2];
void addedge(int u,int v){edge[tot].to=v;edge[tot].nxt=head[u];head[u]=tot++;
}
void init(){tot=0;memset(head,-1,sizeof(head));
}//求LCA
int fa[MAX_N][DEG];
int deg[MAX_N];
void BFS(int root){queue<int>que;deg[root]=0;fa[root][0]=root;que.push(root);while(!que.empty()){int tmp=que.front();que.pop();for(int i=1;i<DEG;i++){fa[tmp][i]=fa[fa[tmp][i-1]][i-1];}for(int i=head[tmp];i!=-1;i=edge[i].nxt){int v=edge[i].to;if(v==fa[tmp][0])continue;deg[v]=deg[tmp]+1;fa[v][0]=tmp;que.push(v);}}
}
int LCA(int u,int v){if(deg[u]>deg[v])swap(u,v);int hu=deg[u],hv=deg[v];int tu=u,tv=v;for(int det=hv-hu,i=0;det;det>>=1,i++){if(det&1)tv=fa[tv][i];}if(tu==tv)return tu;for(int i=DEG-1;i>=0;i--){if(fa[tu][i]==fa[tv][i])continue;tu=fa[tu][i];tv=fa[tv][i];}return fa[tu][0];}
//求DFS序
int dfsn[MAX_N];
int pos[MAX_N];
int dfst=0;
void DFS(int v,int fa){dfsn[v]=++dfst;pos[dfst]=v;for(int i=head[v];i!=-1;i=edge[i].nxt){int u=edge[i].to;if(u==fa)continue;DFS(u,v);}
}
int dis(int u,int v){int res=deg[u]+deg[v]-2*deg[LCA(u,v)];return res;
}
//lc存每一个帮派的LCA
//g存每一个帮派的DFS序
int lc[MAX_N];
vector<int> g[MAX_N];
int n;
int u,v;
void input(){}
int t[MAX_N];
int main(){init();scanf("%d",&n);for(int i=1;i<n;i++){scanf("%d%d",&u,&v);addedge(u,v);addedge(v,u);}BFS(1);DFS(1,-1);int k;scanf("%d",&k);for(int i=1;i<=k;i++){int c,x;scanf("%d",&c);for(int j=1;j<=c;j++){scanf("%d",&x);if(j==1)lc[i]=x;else lc[i]=LCA(lc[i],x);g[i].push_back(dfsn[x]);}sort(g[i].begin(),g[i].end());//cout<<lc[i]<<endl;}//cout<<"****"<<endl;int q,u,cnt;scanf("%d",&q);while(q--){scanf("%d%d",&u,&cnt);for(int i=1;i<=cnt;i++){scanf("%d",&t[i]);}int lca=lc[t[1]];for(int i=2;i<=cnt;i++)lca=LCA(lca,lc[t[i]]);if(LCA(lca,u)!=lca){printf("%d\n",dis(lca,u));continue;}int ans=INF;for(int i=1;i<=cnt;i++){int tmp=t[i];auto p=lower_bound(g[tmp].begin(),g[tmp].end(),dfsn[u]);if(p!=g[tmp].end()){ans=min(ans,dis(u,LCA(u,pos[*p])));}if(p!=g[tmp].begin()){ans=min(ans,dis(u,LCA(u,pos[*prev(p)])));}}printf("%d\n",ans);}}

牛客网【每日一题】7月8日 Alliances相关推荐

  1. 牛客网 每日一题 7月23日题目精讲—wpy的请求

    来源:牛客网: 文章目录 wpy的请求 题解: 代码: wpy的请求 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K Special Judge ...

  2. 2021-09-02牛客网每日10题--前端

    3 ng-class是做什么用的? 给元素绑定类名 eg:用法①: // An highlighted block <div ng-class="{'A':isA,'B':isB,'C ...

  3. 牛客网SQL刷题笔记(MySQL)

    牛客网SQL刷题笔记(MySQL) 此博客集合LeetCode.牛客网常见的题型及其解法,侵删 目录 牛客网SQL刷题笔记(MySQL) 类型1:查找排名第几的数据 SQL2 查找入职员工时间排名倒数 ...

  4. 牛客网Java刷题知识点之关键字static、static成员变量、static成员方法、static代码块和static内部类...

    不多说,直接上干货! 牛客网Java刷题知识点之关键字static static代表着什么 在Java中并不存在全局变量的概念,但是我们可以通过static来实现一个"伪全局"的概 ...

  5. 牛客网Java刷题知识点之构造函数可以调用一般函数,但是一般函数不可以直接调用构造函数...

    不多说,直接上干货! 通过 牛客网Java刷题知识点之构造函数是什么.一般函数和构造函数什么区别呢.构造函数的重载.构造函数的内存图解 我们对构造函数有了一个比较清楚的认识,当我们在创建对象时,我们会 ...

  6. 牛客网Java刷题知识点之Java 集合框架的构成、集合框架中的迭代器Iterator、集合框架中的集合接口Collection(List和Set)、集合框架中的Map集合...

    不多说,直接上干货! 集合框架中包含了大量集合接口.这些接口的实现类和操作它们的算法. 集合容器因为内部的数据结构不同,有多种具体容器. 不断的向上抽取,就形成了集合框架. Map是一次添加一对元素. ...

  7. 牛客网Java刷题知识点之ArrayList 、LinkedList 、Vector 的底层实现和区别

    不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...

  8. 牛客网Veirlog刷题答案目录(持续更新)

    牛客网Veirlog刷题答案目录(持续更新) 基础篇 进阶篇 基础篇 1.VL1--四选一多路选择器 2.VL2--异步复位的串联T触发器 3.VL3--奇偶校验 4.VL4--移位运算与乘法 5.V ...

  9. 牛客网刷算法题的输入输出(C++)

    内容简述 该篇文章将对牛客网刷题中关于输入输出的一些问题作一个总结.每年互联网公司的招聘都必不可少会有算法题,因此平时很多人都会去一些刷题网站进行刷题来学习.这里面用的比较多的刷题网站是leetcod ...

  10. 【百日冲大厂】第十篇,牛客网选择题+编程题井字棋+密码强度等级

    前言: 大家好,我是良辰丫,刷题的第十篇,牛客网选择题+编程题井字棋+密码强度等级.

最新文章

  1. JVM内存模型、指令重排、内存屏障概念解析
  2. java tika pdf转图片_使用tika将pdf转为html
  3. jQuery中$(document).ready()和window.onload的区别?
  4. java 文本编辑器 源码_java文本编辑器源码
  5. Spring集成–第1节– Hello World
  6. GBDT是如何成为推荐系统顶级工具人的?
  7. 国家自然科学基金项目经费怎么用有了新规定
  8. 软考系统架构师笔记-综合知识重点(二)
  9. 如何使用vue使同一个弹窗同时能实现添加和编辑
  10. python编程入门 适合于零基础朋友-[零基础学python]复习if语句
  11. 安全认证Kerberos
  12. LabVIEW 2011中文版下载及工具包下载
  13. 转:原来可以这样出书、写书?
  14. LeetCode 91~95
  15. 关于何如在英伟达官网上下载历史驱动的方法
  16. 【Python 实战基础】 如何绘制中国地图展示省份GDP数据
  17. MySQL 数据库生成自动增长序号
  18. 编码 data:text/html;c,javascript中Data URI使用详解
  19. CGAL 基础知识(学习笔记)
  20. 从互联网跳到国企,本以为上岸了,结果降薪30%,周末要义务加班,所以我图什么?...

热门文章

  1. 中国数学竞赛史上最玩命的“赌徒”,为了国家荣誉,他不惜用生命换来了五次世界第一...
  2. 世界上没有后悔药,时间匆匆,从关注它们开始......
  3. 将历史、数学、语文、地理、政治知识融会贯通的诀窍就是它
  4. 最全知识点总结!| 大数据学习路线指南
  5. 看见到洞见之引子(二)机器学习算法
  6. 我们计划招收300名学员,免费攻读人工智能专业
  7. 有效处理 Java 异常三原则
  8. Java开发之上班摸鱼!写最少的代码!
  9. java定时器报错,定时器设置报错
  10. jsp后台批量导入excel表格数据到mysql中_PHP批量导入excell表格到mysql数据库