题目链接

戳我

\(Solution\)

我们看到这题之后发现这题不是\(n^2\)把边弄出来后就跟货车运输差不多了,但是看了数据后发现\(n^2\)条边建不出来啊,这里就不详细的讲\(kruskal\)重构树了,只讲怎么建边

所以我们要考虑怎么优化这个建边方式

显然这里不可以用什么线段树,倍增,前后缀什么的来优化。

所以我们应该考虑怎么减少需要边的数量。

我们可以很容易的发现在这\(n^2\)条边中有些是可以不用的。

举个栗子:

我们三个点\(x,y,z\)

\(x\)到\(y\)有一条\(1\)的边

\(y\)到\(z\)有一条\(1\)的边

\(x\)到\(z\)有一条\(2\)的边

可以发现\(x\)到\(z\)的边没有意义,我们可以通过\(x\)到\(y\)再到\(z\),这样子显然不会影响答案

我们考虑怎么不建立这些无意义的边。

可以先把每个建筑加入队列,跑\(bfs\).如果在拓展一个建筑的“势力范围”时发现这个点已经被“占领”了,这个点肯定在连接两个建筑的最短路径上.于是在这里给这两个建筑建边即可。

至于实现,留作课后作业.

然后在康康边权,这个可以用一个\(vector\)存,这样就不用\(sort\)了。但是我\(sort\)也过了

\(Code\)

  1. #include<bits/stdc++.h>
  2. #define file(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
  3. using namespace std;
  4. const int N=4e5+10;
  5. int read(){
  6. int x=0,f=1;char c=getchar();
  7. while(c<'0'||c>'9') f=(c=='-')?-1:1,c=getchar();
  8. while(c>='0'&&c<='9') x=x*10+c-48,c=getchar();
  9. return f*x;
  10. }
  11. struct node1 {
  12. int to,next;
  13. }e[1000001];
  14. struct node{
  15. int x,y,v;
  16. }b[N*50];
  17. int res,cnt,n,m,t,pre[N],head[N],vis[N],W,H,Q,P,x,y;
  18. int f[N][21],dep[N],val[N],bin[101];
  19. int Vis[2010][2010],bj[2010][2010];
  20. char Map[2010][2010];
  21. void add(int x,int y){ e[++cnt].to=y,e[cnt].next=head[x],head[x]=cnt; }
  22. int find(int x){ return pre[x]==x?x:pre[x]=find(pre[x]); }
  23. bool cmp(const node & a , const node & b ){ return a.v<b.v; }
  24. void dfs(int k){
  25. vis[k]=1;
  26. for(int j=1;j<=20;j++)
  27. f[k][j]=f[f[k][j-1]][j-1];
  28. for(int i=head[k];i;i=e[i].next){
  29. int v=e[i].to;
  30. f[v][0]=k,dep[v]=dep[k]+1;
  31. dfs(v);
  32. }
  33. }
  34. int lca(int x,int y){
  35. if(dep[x]<dep[y])
  36. swap(x,y);
  37. for(int i=20;i>=0;i--)
  38. if(dep[x]-(1<<i)>=dep[y])
  39. x=f[x][i];
  40. if(x==y)
  41. return y;
  42. for(int i=20;i>=0;i--){
  43. if(f[x][i]==f[y][i]||!f[y][i]||!f[x][i])
  44. continue;
  45. x=f[x][i],y=f[y][i];
  46. }
  47. return f[x][0];
  48. }
  49. void build(){
  50. res=n,sort(b+1,b+1+m,cmp);
  51. for(int i=1;i<=m;i++){
  52. int fx=find(b[i].x),fy=find(b[i].y);
  53. if(fx!=fy)
  54. val[++res]=b[i].v,pre[fx]=res,pre[fy]=res,add(res,fx),add(res,fy);
  55. if(res==n*2-1)
  56. break;
  57. }
  58. }
  59. struct node2{
  60. int id,x,y,v;
  61. };
  62. queue<node2> q;
  63. int fx[10]={0,0,0,-1,1};
  64. int fy[10]={0,1,-1,0,0};
  65. void bfs(){
  66. for(int i=1;i<=n;i++)
  67. x=read(),y=read(),q.push((node2){i,x,y,0}),Vis[x][y]=i;
  68. while(!q.empty()){
  69. node2 now=q.front();
  70. q.pop();
  71. for(int i=1;i<=4;i++){
  72. int x=now.x+fx[i],y=now.y+fy[i];
  73. if(x<1||y<1||x>H||y>W||Map[x][y]=='#') continue;
  74. if(Vis[x][y]) b[++m].x=now.id,b[m].y=Vis[x][y],b[m].v=now.v+bj[x][y];
  75. else Vis[x][y]=now.id,bj[x][y]=now.v+1,q.push((node2){now.id,x,y,now.v+1});
  76. }
  77. }
  78. }
  79. int main(){
  80. bin[1]=0,H=read(),W=read(),n=read(),Q=read();
  81. for(int i=1;i<=H;i++)
  82. scanf("%s",Map[i]+1);
  83. for(int i=1;i<=n*2;i++) pre[i]=i;
  84. for(int i=1;i<=20;i++) bin[i]=bin[i-1]<<1;
  85. bfs();
  86. build();
  87. for(int i=1;i<=n;i++)
  88. if(!vis[i])
  89. dfs(find(i));
  90. while(Q--){
  91. int x=read(),y=read(),p=lca(x,y);
  92. if(p==0)
  93. cout<<"-1\n";
  94. else
  95. cout<<val[p]<<endl;
  96. }
  97. }

「BZOJ4242」水壶的更多相关文章

  1. 「译」JUnit 5 系列:条件测试

    原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...

  2. 「译」JUnit 5 系列:扩展模型(Extension Model)

    原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...

  3. JavaScript OOP 之「创建对象」

    工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...

  4. 「C++」理解智能指针

    维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...

  5. 「JavaScript」四种跨域方式详解

    超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...

  6. 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management

    写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...

  7. 「2014-3-18」multi-pattern string match using aho-corasick

    我是擅(倾)长(向)把一篇文章写成杂文的.毕竟,写博客记录生活点滴,比不得发 paper,要求字斟句酌八股结构到位:风格偏杂文一点,也是没人拒稿的.这么说来,arxiv 就好比是 paper 世界的博 ...

  8. 「2014-3-17」C pointer again …

    记录一个比较基础的东东-- C 语言的指针,一直让人又爱又恨,爱它的人觉得它既灵活又强大,恨它的人觉得它太过于灵活太过于强大以至于容易将人绕晕.最早接触 C 语言,还是在刚进入大学的时候,算起来有好些 ...

  9. 「2014-3-13」Javascript Engine, Java VM, Python interpreter, PyPy – a glance

    提要: url anchor (ajax) => javascript engine (1~4 articles) => java VM vs. python interpreter =& ...

随机推荐

  1. CentOS7 yum安装Mariadb

    1.安装Mariadb #yum -y install mariadb mariadb-server 1.1当执行程序末端显示Complete则完成安装 2.安装完成后启动服务 # systemctl ...

  2. $.ajax通用格式&&XMLHttpRequest对象属性和方法

    $.ajax({ url: "", type: "POST", async: false, cache:false, //默认true data: {}, da ...

  3. 实现a标签按钮完全禁用

    前言 最近在开发时遇见一个问题 我们知道a标签的disabled属性部分浏览器支持,但是尽管设置了disabled属性也无法阻挡任何鼠标经过或是点击事件的,那么如何实现a标签按钮的禁用呢? 转换一下思 ...

  4. ZROI Day1 比赛解题报告

    ZROI Day1 比赛解题报告 版权原因不提供题面相关信息 序 前天晚上搞得比较晚,然后早上做题很没状态,刚看到T1发现没什么思路就有点慌,赶紧看了看T2,T3, 发现T3暴力很好打,T2想了一想可 ...

  5. [转载]from __future__ import的用法

    一句话概况:这是为了在低版本python中使用高版本特性而引入的,最常用的就是print_function来实现在2.x中使用3.x中的print()命令,从而避免在切换版本时修改代码. https: ...

  6. 如何调试Python程序 通过IDLE

    在python3.3环境下 1.写一个简单地Python源文件,比如test.py,内容如下: import sys, osdef test(arg1, arg2): print "begi ...

  7. Java高并发程序设计学习笔记(十):并发调试和JDK8新特性

    转自:https://blog.csdn.net/dataiyangu/article/details/87631574 多线程调试的方法使用Eclipse进行多线程调试线程dump及分析分析死锁案例 ...

  8. WLW模板插件Text Templat的应用举例

    WLW的模板插件:WLWTextTemplates 安装之后,如下图所示: 点击这个按键之后,出现下图: 按上图提示点击"Add new Template",出现下图:   举个例 ...

  9. Docker_云计算技术简述

    Docker官方网站 > https://www.docker.com/Docker博客 > https://www.docker.com/blog/Docker内容库 > http ...

  10. kettle Spoon.bat闪退解决办法

    1.Java环境配置问题 java_home:D:\Program Files\Java\jdk1.7.0_25(安装jdk路径) classpath:.;%java_home%\lib\dt.jar ...