[JZOJ 5875] [NOIP2018提高组模拟9.20] 听我说,海蜗牛 解题报告(BFS+二分)
题目链接:
http://172.16.0.132/senior/#main/show/5875
题目:
题解:
注意这题只能经过开放的港口
我们考虑用vector存下每个点不能到的点,并把并让vector里面的元素升序排序,这样我们就可以二分查找一个点是否与另外一个点相连
接下来我们对于每一个开放的港口bfs,每次bfs都把属于这个连通块的港口去掉
考虑开两个队列来bfs,队列1存储的是当前连通块里还没有拓展的点,队列2里存储的是还剩下的点,看看代码就可以理解了
- #include<algorithm>
- #include<cstring>
- #include<cstdio>
- #include<iostream>
- #include<vector>
- #include<queue>
- using namespace std;
- const int N=1e5+;
- int n,m,t;
- struct E{
- int x,y;
- }e[N<<];
- vector <int> p[N];
- queue <int> Q;
- inline int read(){
- char ch=getchar();int s=,f=;
- while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
- while (ch>=''&&ch<='') {s=(s<<)+(s<<)+ch-'';ch=getchar();}
- return s*f;
- }
- bool cmp(E a,E b){return a.x<b.x||(a.x==b.x&&a.y<b.y);}
- int find(int u,int v){
- int l=,r=p[u].size()-;
- if (l>r) return -;
- while (l<=r){
- if (l==r) return p[u][l];
- int mid=l+r>>;
- if (p[u][mid]>v) r=mid-;else
- if (p[u][mid]<v) l=mid+;else
- if (p[u][mid]==v) return p[u][mid];
- }
- return p[u][l];
- }
- void bfs(int x){
- queue <int> qq,q;
- qq.push(x);
- while (!qq.empty())
- {
- int u=qq.front();qq.pop();
- while (!Q.empty()){
- int v=Q.front();Q.pop();
- if (find(u,v)!=v) qq.push(v);
- else q.push(v);
- }
- while (!q.empty()){
- int v=q.front();q.pop();
- Q.push(v);
- }
- }
- }
- int main(){
- freopen("connect.in","r",stdin);
- freopen("connect.out","w",stdout);
- n=read();m=read();t=read();
- int cnt=;
- for (int i=;i<=m;i++){
- ++cnt;
- e[cnt].x=read();e[cnt].y=read();
- ++cnt;
- e[cnt].x=e[cnt-].y;e[cnt].y=e[cnt-].x;
- }
- sort(e+,e++cnt,cmp);
- for (int i=;i<=cnt;i++) p[e[i].x].push_back(e[i].y);
- while (t--){
- int k=read(),ans=;
- while (!Q.empty()) Q.pop();
- for (int i=;i<=k;i++){
- int s=read();
- Q.push(s);
- }
- while (!Q.empty()){
- int s=Q.front();Q.pop();
- bfs(s);++ans;
- }
- printf("%d\n",ans);
- }
- return ;
- }
[JZOJ 5875] [NOIP2018提高组模拟9.20] 听我说,海蜗牛 解题报告(BFS+二分)的更多相关文章
- [jzoj 5178] [NOIP2017提高组模拟6.28] So many prefix? 解题报告(KMP+DP)
题目链接: https://jzoj.net/senior/#main/show/5178 题目: 题解: 我们定义$f[pos]$表示以位置pos为后缀的字符串对答案的贡献,答案就是$\sum_{i ...
- [JZOJ 5852] [NOIP2018提高组模拟9.6] 相交 解题报告 (倍增+LCA)
题目链接: http://172.16.0.132/senior/#main/show/5852 题目: 题目大意: 多组询问,每次询问树上两条链是否相交 题解: 两条链相交并且仅当某一条链的两个端点 ...
- NOIP2018提高组模拟题(五)
字符串(string) Description 小林与亮亮正在做一个游戏.小林随意地写出一个字符串,字符串只由大写 字母组成,然后指定一个非负整数 m,亮亮可以进行至多 m 次操作,每次操作 为交换相 ...
- 2019.6.21 NOIP2018提高组模拟题(二)
1.咒语 (curse.pas/c/cpp) [题目描述] 亮亮梦到自己来到了魔法城堡,但一扇巨大的石门阻拦了他通向城堡内的路.正当他沮丧之际,突然发现门上有一处机关,机关上有一张很长的纸条.亮亮拿起 ...
- NOIP2018提高组模拟题(六)
购物(shop) Description 小林来到商店中进行购物.商店里一共有 n 件物品,第 i 件物品的价格为 a[i] 元.小林总共需要购买 m 件物品,他希望他所花费的钱最少,请你计算出最小 ...
- 10.18 NOIP2018提高组模拟题(二)
大水题 1.咒语 (curse.pas/c/cpp) [题目描述] 亮亮梦到自己来到了魔法城堡,但一扇巨大的石门阻拦了他通向城堡内的路.正当他沮丧之际,突然发现门上有一处机关,机关上有一张很长的纸条. ...
- [jzoj 5177] [NOIP2017提高组模拟6.28] TRAVEL 解题报告 (二分)
题目链接: https://jzoj.net/senior/#main/show/5177 题目: 题解: 首先选出的泡泡怪一定是连续的一段 L,R 然后 L 一定属于虫洞左边界中的某一个 R 也同样 ...
- jzoj5879. 【NOIP2018提高组模拟9.22】电路图 B
tj:一道好題 看區間操作可以想到線段樹 並聯操作公式:a1∗a2/(a1+a2)a1*a2/(a1+a2)a1∗a2/(a1+a2) 串聯操作公式:a1+a2a1+a2a1+a2 我們發現,一個區間 ...
- NOIP2018提高组模拟题(四)
能量(energy) Description 有一块能量田,它的形状是 n*m的矩形,每一个格子上都有一个能量值 a[x][y] (可正可负).一块矩形田的能量定义为它的每个格子的能量值之和. ...
随机推荐
- DB-MySQL:MySQL 序列使用
ylbtech-DB-MySQL:MySQL 序列使用 1.返回顶部 1. MySQL 序列使用 MySQL 序列是一组整数:1, 2, 3, ...,由于一张数据表只能有一个字段自增主键, 如果你想 ...
- android编译ffmpeg+x264
下载最新版的x264ftp://ftp.videolan.org/pub/videolan/x264/snapshots/1.解压到指定的目录2.切换当前目录为该目录3.创建一个shell脚本buil ...
- 看似简单!解读C#程序员最易犯的7大错误
编程时犯错是必然的,即使是一个很小的错误也可能会导致昂贵的代价,聪明的人善于从错误中汲取教训,尽量不再重复犯错,在这篇文章中,我将重点介绍C#开发人员最容易犯的7个错误. 格式化字符串 在C#编程中, ...
- 自定义view 之多个引导层动画效果
SupernatantView 如果我英文还可以的话这个应该叫做漂浮在上层的view---引导层 今天闲来无事看了网上的一些引导层案例总感觉如果不是很舒服,就是类似于很死板的显示和消失 我在想能不能弄 ...
- Navicat for Mysql 关于1130错误,无法正常方法解决的解决办法。
本人因为失误操作,不小心将mysql 玩崩了.导致一直报1130错误,无法进入. 看了很多网上的帖子,但是那些办法都行不通.最后通过好友的指点,解决了这个问题. 1.停止MySQL服务,执行net ...
- CDR中怎么绘制一个漂亮的球衣?
cdr中怎么绘制一个漂亮的球衣?想要绘制一个漂亮的球衣,该怎么绘制呢?下面我们就来看看cdr绘制漂亮的球衣的教程,需要的朋友可以参考下: 1.画一个长方形,增加节点,移动节点,变形成如图 2.直线变曲 ...
- 值得尝试的十款 GNOME Shell 扩展
值得尝试的十款 GNOME Shell 扩展 作者: JACK WALLEN 译者: 核子可乐 | 2016-09-22 17:10 评论: 6 收藏: 1 当 GNOME Shell(即 GNO ...
- Oracle查询优化之减少统计的数据量
统计各部门人数很简单,通过部门分组即可,要统计部门以下下级部门的人数也简单,通过递归.要统计所有有下级部门的部门人数(包含下级)页比较简单, 先查询出有下级的部门,在对每个部门进行递归查询,如下: ) ...
- HDU 5289 Assignment [优先队列 贪心]
HDU 5289 - Assignment http://acm.hdu.edu.cn/showproblem.php?pid=5289 Tom owns a company and he is th ...
- NOIP2013 华容道 (棋盘建图+spfa最短路)
#include <cstdio> #include <algorithm> #include <cstring> #include <queue> # ...