牛客网【每日一题】7月8日 Alliances

来源:牛客网

文章目录

    • 题目描述
    • 题解:
    • 代码:

时间限制: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);}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319781.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【bfs】廉价最短路径(2013特长生 T4)

题目大意 给你一个图&#xff0c;每条边有一个代价&#xff0c;让你求0到1在最短路径的前提下的最小代价 解题思路 bfs同时求个最代价 代码 #include<queue> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #de…

Ocelot简易教程(四)之请求聚合以及服务发现

上篇文章给大家讲解了Ocelot的一些特性并对路由进行了详细的介绍&#xff0c;今天呢就大家一起来学习下Ocelot的请求聚合以及服务发现功能。希望能对大家有所帮助。作者&#xff1a;依乐祝原文地址&#xff1a;https://www.cnblogs.com/yilezhu/p/9695639.html请求聚合Ocelot允…

邓公数据结构C++语言版学习笔记1

1. 对于计算幂2n2^n2n的算法优化 暴力算法时间复杂度O(n)O(n)O(n) __int64 power2BF_I(int n) //幂函数2^n算法&#xff08;蛮力迭代版&#xff09;&#xff0c;n > 0{ __int64 pow 1; //O(1)&#xff1a;累积器刜始化为2^0while (0 < n --) //O(n)&#xff1a;迭代n轮…

【每日一题】7月9日题目 Color

来源&#xff1a;牛客网&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 131072K&#xff0c;其他语言262144K Special Judge, 64bit IO Format: %lld文章目录题目描述题解&#xff1a;代码&#xff1a;题目描述 给一个没有重边的二…

【DP】K星人的语言(2020特长生 T3)

题目大意 给你一个字符串和若干单词&#xff0c;问你最少删除多少字符使其成为若干单词连在一起的字符串 解题思路 设fif_ifi​为前i个位置的最小代价 然后枚举每个单词即可 代码 #include<cstdio> #include<cstring> #include<iostream> #include<al…

HttpClientFactory系列二:集成Polly处理瞬态故障

前言&#xff1a;最近&#xff0c;同事在工作中遇到了使用HttpClient,有些请求超时的问题&#xff0c;辅导员让我下去调研一下&#xff0c;HttpClinet的使用方式已经改成了之前博客中提到的方式&#xff0c;问题的原因我已经找到了&#xff0c;就是因为使用了伪异步&#xff0c…

Loj#6053-简单的函数【Min25筛】

正题 题目链接:https://loj.ac/p/6053 题目大意 定义一个积性函数f(pc)pxorcf(p^c)p\ xor\ cf(pc)p xor c&#xff0c;求∑i1nf(i)\sum_{i1}^nf(i)∑i1n​f(i) 解题思路 异或这个东西不太好搞&#xff0c;要考虑怎么求出ggg数组。 当ppp为质数时f(p)p−1f(p)p-1f(p)p−1&am…

邓公数据结构C++语言版学习笔记——二叉树

二叉树的遍历 一. preorder——先序遍历VLR 1. 递归先序遍历 2. 迭代先序遍历 3.先序遍历图解 二. inorder——先序遍历LVR 1. 递归中序遍历 2.迭代中序遍历 3.迭代中序遍历优化空间复杂度 <1>定义直接后继 <2>借用直接后继优化算法 解释&#xff1a;…

二分图匹配--匈牙利算法

文章目录二分图&#xff1a;匹配匈牙利算法代码&#xff1a;二分图&#xff1a; 二分图是一个无向图&#xff0c;点集分成子集X和Y&#xff0c;图中每一条边都是一边在X一边在Y 当且仅当无向图G的每一个回路次数都是偶数时&#xff08;包括0&#xff09;&#xff0c;G就是一个…

CF757F-Team Rocket Rises Again【最短路,DAG支配树】

正题 题目链接:https://www.luogu.com.cn/problem/CF757F 题目大意 nnn个点mmm条边的一张无向图&#xff0c;求删除sss以外的一个点改变sss到最多点的最短路。 解题思路 挺裸的一道题的&#xff0c;首先肯定要跑一遍最短路搞出最短路树。 然后如果最短路树上sss到某个点的路…

星座图(2020特长生 T4)

题目大意 给你一棵树&#xff0c;距离为2的两个点代价为wi∗wjw_i*w_jwi​∗wj​&#xff0c;问你最小代价和代价之和 解题思路 搜索这棵树&#xff0c;每次拿父亲和子节点一起计算即可 代码 #include<cstdio> #include<cstring> #include<algorithm> #de…

《Office 365开发入门指南》上市说明和读者服务

写在最开始的话拙作《Office 365开发入门指南》上周开始已经正式在各大书店、在线商城上市&#xff0c;欢迎对Office 365的开发、生态感兴趣的开发者、项目经理、产品经理参考本书&#xff0c;全面了解Office 365带来的全新机遇以及在具体业务应用开发中的场景。写作本书差不多…

简单理解手机快充

浅谈手机快充 背景 智能手机发展这么些年&#xff0c;屏幕显示越来越清晰&#xff0c;拍照像素越来越高&#xff0c;处理器性能越来越强&#xff0c;运行内存甚至开始超过PC&#xff0c;不过手机的续航还是一个问题&#xff1a;处理器性能以及一系列的增强无疑对电池是一个巨…

最短路模板

文章目录dijstraSPFAdijstra #include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<algorithm> using namespace std; const int MAXN10010,MAXM500010; int inf2147483647; struct XY{int w,to,pre; }e[MAXM];str…

P6499-[COCI2016-2017#2]Burza【状压dp】

正题 题目链接:https://www.luogu.com.cn/problem/P6499 题目大意 nnn个点的一棵树&#xff0c;开始有一个棋子在根处&#xff0c;开始先手选择一个点封锁&#xff0c;然后后手封锁棋子所在点然后移动一步到一个没有封锁的点&#xff0c;之后轮流进行。 先手不知道后手的移动…

各种dp优化

dp优化思路 dp三要素&#xff1a; 状态、决策、转移 dp优化思路&#xff1a; 减少状态总数减少决策时间&#xff08;减少每个状态转移的状态数&#xff09;减少转移时间 矩阵优化dp &#xff08;其实质是优化 “转移”&#xff09; 博客 数据结构优化dp &#xff08;其实…

裁缝师(2011特长生 T2)

题目大意 给你一个NM的布&#xff0c;你可以将最多L块布同时剪一刀&#xff0c;问你把他全部剪成11的最少要多少刀 解题思路#1 直接从中间剪&#xff0c;然后dfs求出一个图&#xff0c;然后每次找L个点去跑 代码#1 #include<queue> #include<cstdio> #include&l…

【送书活动】C# 程序员的自我修养

如果希望成为一个C# 高手&#xff0c;或者至少是合格的C# 程序员&#xff0c;应该懂些什么&#xff1f;《C#从现象到本质》&#xff08;以下简称本书&#xff09;试图回答这个问题。实际上&#xff0c;在本书问世之前&#xff0c;市面上已经有很多优秀的C# 书籍&#xff0c;例如…

【c++算法刷题笔记】——洛谷2

1. 洛谷练习——P1579 哥德巴赫猜想&#xff08;升级版&#xff09; 题目描述&#xff1a; 现在请你编一个程序验证哥德巴赫猜想。 先给出一个奇数n&#xff0c;要求输出3个质数&#xff0c;这3个质数之和等于输入的奇数。 输入格式&#xff1a; 仅有一行&#xff0c;包含一个…

【每日一题】7月10日精讲—矩阵取数游戏

来源&#xff1a;牛客网&#xff1a; 文章目录题目描述题解&#xff1a;代码&#xff1a;时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 帅帅经常跟同学玩一个矩阵取数游戏&…