题目链接:

http://172.16.0.132/senior/#main/show/5875

题目:

题解:

注意这题只能经过开放的港口

我们考虑用vector存下每个点不能到的点,并把并让vector里面的元素升序排序,这样我们就可以二分查找一个点是否与另外一个点相连

接下来我们对于每一个开放的港口bfs,每次bfs都把属于这个连通块的港口去掉

考虑开两个队列来bfs,队列1存储的是当前连通块里还没有拓展的点,队列2里存储的是还剩下的点,看看代码就可以理解了

  1. #include<algorithm>
  2. #include<cstring>
  3. #include<cstdio>
  4. #include<iostream>
  5. #include<vector>
  6. #include<queue>
  7. using namespace std;
  8.  
  9. const int N=1e5+;
  10. int n,m,t;
  11. struct E{
  12. int x,y;
  13. }e[N<<];
  14. vector <int> p[N];
  15. queue <int> Q;
  16. inline int read(){
  17. char ch=getchar();int s=,f=;
  18. while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
  19. while (ch>=''&&ch<='') {s=(s<<)+(s<<)+ch-'';ch=getchar();}
  20. return s*f;
  21. }
  22. bool cmp(E a,E b){return a.x<b.x||(a.x==b.x&&a.y<b.y);}
  23. int find(int u,int v){
  24. int l=,r=p[u].size()-;
  25. if (l>r) return -;
  26. while (l<=r){
  27. if (l==r) return p[u][l];
  28. int mid=l+r>>;
  29. if (p[u][mid]>v) r=mid-;else
  30. if (p[u][mid]<v) l=mid+;else
  31. if (p[u][mid]==v) return p[u][mid];
  32. }
  33. return p[u][l];
  34. }
  35. void bfs(int x){
  36. queue <int> qq,q;
  37. qq.push(x);
  38. while (!qq.empty())
  39. {
  40. int u=qq.front();qq.pop();
  41. while (!Q.empty()){
  42. int v=Q.front();Q.pop();
  43. if (find(u,v)!=v) qq.push(v);
  44. else q.push(v);
  45. }
  46. while (!q.empty()){
  47. int v=q.front();q.pop();
  48. Q.push(v);
  49. }
  50. }
  51. }
  52. int main(){
  53. freopen("connect.in","r",stdin);
  54. freopen("connect.out","w",stdout);
  55. n=read();m=read();t=read();
  56. int cnt=;
  57. for (int i=;i<=m;i++){
  58. ++cnt;
  59. e[cnt].x=read();e[cnt].y=read();
  60. ++cnt;
  61. e[cnt].x=e[cnt-].y;e[cnt].y=e[cnt-].x;
  62. }
  63. sort(e+,e++cnt,cmp);
  64. for (int i=;i<=cnt;i++) p[e[i].x].push_back(e[i].y);
  65. while (t--){
  66. int k=read(),ans=;
  67. while (!Q.empty()) Q.pop();
  68. for (int i=;i<=k;i++){
  69. int s=read();
  70. Q.push(s);
  71. }
  72. while (!Q.empty()){
  73. int s=Q.front();Q.pop();
  74. bfs(s);++ans;
  75. }
  76. printf("%d\n",ans);
  77. }
  78. return ;
  79. }

[JZOJ 5875] [NOIP2018提高组模拟9.20] 听我说,海蜗牛 解题报告(BFS+二分)的更多相关文章

  1. [jzoj 5178] [NOIP2017提高组模拟6.28] So many prefix? 解题报告(KMP+DP)

    题目链接: https://jzoj.net/senior/#main/show/5178 题目: 题解: 我们定义$f[pos]$表示以位置pos为后缀的字符串对答案的贡献,答案就是$\sum_{i ...

  2. [JZOJ 5852] [NOIP2018提高组模拟9.6] 相交 解题报告 (倍增+LCA)

    题目链接: http://172.16.0.132/senior/#main/show/5852 题目: 题目大意: 多组询问,每次询问树上两条链是否相交 题解: 两条链相交并且仅当某一条链的两个端点 ...

  3. NOIP2018提高组模拟题(五)

    字符串(string) Description 小林与亮亮正在做一个游戏.小林随意地写出一个字符串,字符串只由大写 字母组成,然后指定一个非负整数 m,亮亮可以进行至多 m 次操作,每次操作 为交换相 ...

  4. 2019.6.21 NOIP2018提高组模拟题(二)

    1.咒语 (curse.pas/c/cpp) [题目描述] 亮亮梦到自己来到了魔法城堡,但一扇巨大的石门阻拦了他通向城堡内的路.正当他沮丧之际,突然发现门上有一处机关,机关上有一张很长的纸条.亮亮拿起 ...

  5. NOIP2018提高组模拟题(六)

    购物(shop) Description 小林来到商店中进行购物.商店里一共有 n 件物品,第 i 件物品的价格为 a[i] 元.小林总共需要购买 m 件物品,他希望他所花费的钱最少,请你计算出最小 ...

  6. 10.18 NOIP2018提高组模拟题(二)

    大水题 1.咒语 (curse.pas/c/cpp) [题目描述] 亮亮梦到自己来到了魔法城堡,但一扇巨大的石门阻拦了他通向城堡内的路.正当他沮丧之际,突然发现门上有一处机关,机关上有一张很长的纸条. ...

  7. [jzoj 5177] [NOIP2017提高组模拟6.28] TRAVEL 解题报告 (二分)

    题目链接: https://jzoj.net/senior/#main/show/5177 题目: 题解: 首先选出的泡泡怪一定是连续的一段 L,R 然后 L 一定属于虫洞左边界中的某一个 R 也同样 ...

  8. jzoj5879. 【NOIP2018提高组模拟9.22】电路图 B

    tj:一道好題 看區間操作可以想到線段樹 並聯操作公式:a1∗a2/(a1+a2)a1*a2/(a1+a2)a1∗a2/(a1+a2) 串聯操作公式:a1+a2a1+a2a1+a2 我們發現,一個區間 ...

  9. NOIP2018提高组模拟题(四)

    能量(energy) Description ​ 有一块能量田,它的形状是 n*m的矩形,每一个格子上都有一个能量值 a[x][y] (可正可负).一块矩形田的能量定义为它的每个格子的能量值之和. ​ ...

随机推荐

  1. c++面向对象程序设计 课后题 答案 谭浩强 第四章

    c++面向对象程序设计课后题答案 谭浩强 第四章 1: #include <iostream> using namespace std; class Complex {public: Co ...

  2. C++之易混淆知识点四---虚函数与虚继承

    C++面向对象中,虚函数与虚继承是两个完全不同的概念. 一.虚函数 C++程序中只要类中含有虚拟函数,编译程序都会为此类生成一个对应的虚拟函数跳转表(vtbl),该虚拟函数跳转表是一个又若干个虚拟函数 ...

  3. JavaScript DOM编程艺术(第2版)学习笔记1(1~4章)

    第一章 一些基本概念 HTML(超文本标记语言),构建网页的静态结构,由一系列的DOM组成: CSS(层叠样式表),给网页各部分结构添加样式: JavaScript,通过获取DOM给静态结构加上动作, ...

  4. pgpool中定义的数据库节点及pgpool支持的复制模式

    /* * The first DB node id appears in pgpool.conf or the first "live" DB * node otherwise.  ...

  5. IntelliJ Idea使用代码折叠

    VS风格: //region    xxxxxxxxxxxxxx ............. //endregion 快捷键: Ctrl+Shift+”+/-”,全部展开.折叠

  6. Projective Texture Mapping - 投影纹理

    昨天导师让写一个投影纹理,将一个相机渲染的图片的一部分投影到另外一个相机里面,目的是无缝的拼接. 投影纹理就和shadow map一样,都是将片元转换到另外一个相机/光源坐标系下,投影后找到对应的纹素 ...

  7. jtable的用法

    一.创建表格控件的各种方式:1)  调用无参构造函数.JTable table = new JTable();2)  以表头和表数据创建表格.Object[][] cellData = {{" ...

  8. C语言-统计数字、字母、特殊字符

    Action() { //统计字符019aBcd8***,4,4,3 int i,z,t; char *str="019aBcd8***"; fun_Count(str,i,z,t ...

  9. 怎样验证layer.prompt输入的值为数值型???

    JS中使用isNaN()判断layer.prompt输入的值为数值型,代码如下: layer.prompt({ title: '设置比值', }, function(value, index, ele ...

  10. Linux(1)---常用命令

    1.将tgz文件解压到指定目录: # tar zxvf test.tgz -C 指定目录 比如将 /lyl/test.tgz解压到 /lyl/linux 目录下 # tar zxvf /lyl/tes ...