Description

Input

Output

扫描线求出平面图的对偶图然后求最小生成树,用并查集按秩合并,以便查询两点间路径最大权

  1. #include<stdio.h>
  2. #include<algorithm>
  3. #include<vector>
  4. #include<set>
  5. #include<cmath>
  6. int f[],f2[],h2[];
  7. int get(int*f,int x){
  8. int a=x,c;
  9. while(x!=f[x])x=f[x];
  10. while(x!=f[a])c=f[a],f[a]=x,a=c;
  11. return x;
  12. }
  13. int get2(int x){
  14. while(x!=f2[x])x=f2[x];
  15. return x;
  16. }
  17. void merge(int a,int b){
  18. a=get(f,a);b=get(f,b);
  19. if(a<b)f[b]=a;
  20. else f[a]=b;
  21. }
  22. double X;
  23. struct ln{
  24. double k,b;int id;
  25. double operator()(double x)const{return k*x+b;}
  26. bool operator<(ln w)const{return operator()(X)+1e-<w(X);}
  27. };
  28. std::set<ln>line;
  29. struct pos{
  30. double x,y;
  31. void R(){
  32. scanf("%lf%lf",&x,&y);
  33. }
  34. }ps[],qs[][];
  35. struct dir{
  36. double d;
  37. int i1,i2;
  38. bool operator<(dir w)const{return d<w.d;}
  39. };
  40. std::vector<dir>vs[];
  41. struct ev{
  42. int t;
  43. double x;
  44. int w;
  45. bool operator<(ev a)const{return x!=a.x?x<a.x:t<a.t;}
  46. }e[];
  47. int ep=,ee[];
  48. int n,m,q;
  49. struct edge{
  50. int a,b,c,ID;
  51. ln l;
  52. void R(int I){
  53. ID=I;
  54. scanf("%d%d%d",&a,&b,&c);
  55. if(ps[a].x>ps[b].x)std::swap(a,b);
  56. if(ps[a].x!=ps[b].x){
  57. e[ep++]=(ev){,ps[a].x,I};
  58. e[ep++]=(ev){,ps[b].x,I};
  59. double k=(ps[b].y-ps[a].y)/(ps[b].x-ps[a].x);
  60. l=(ln){k,ps[a].y-ps[a].x*k,I};
  61. }
  62. vs[a].push_back((dir){atan2(ps[b].y-ps[a].y,ps[b].x-ps[a].x),I,I+m});
  63. vs[b].push_back((dir){atan2(ps[a].y-ps[b].y,ps[a].x-ps[b].x),I+m,I});
  64. }
  65. bool operator<(const edge&w)const{return c<w.c;}
  66. }es[];
  67. int ws[][];
  68. void maxs(int&a,int b){if(a<b)a=b;}
  69. int main(){
  70. scanf("%d%d",&n,&m);
  71. for(int i=;i<=m*;++i)f[i]=f2[i]=i;
  72. for(int i=;i<=n;++i)ps[i].R();
  73. for(int i=;i<=m;++i)es[i].R(i);
  74. scanf("%d",&q);
  75. for(int i=;i<=q;++i){
  76. qs[i][].R();
  77. qs[i][].R();
  78. e[ep++]=(ev){,qs[i][].x,i};
  79. e[ep++]=(ev){,qs[i][].x,i};
  80. }
  81. std::sort(e,e+ep);
  82. e[ep].x=e[ep-].x+;
  83. double x0=e[].x-,x1;
  84. for(int i=,j=;i<ep;){
  85. x1=e[i].x;
  86. for(;j<ep&&e[j].x==x1;++j);
  87. X=(x0+x1)/.;
  88. for(;i<j&&e[i].t==;++i){
  89. std::set<ln>::iterator it=line.find(es[e[i].w].l);
  90. line.erase(it);
  91. }
  92. X=(x1+e[j].x)/.;
  93. for(int k=i;k<j&&e[k].t==;++k){
  94. ln w=es[e[k].w].l;
  95. line.insert(w);
  96. }
  97. for(;i<j&&e[i].t==;++i){
  98. ln w=es[e[i].w].l;
  99. std::set<ln>::iterator it=line.find(w);
  100. ++it;
  101. if(it==line.end())merge(,e[i].w+m);
  102. else merge(e[i].w+m,it->id);
  103. --it;
  104. if(it==line.begin())merge(,e[i].w);
  105. else --it,merge(e[i].w,it->id+m);
  106. }
  107. X=x1;
  108. for(;i<j;++i){
  109. ln w=(ln){,qs[e[i].w][e[i].t-].y,};
  110. std::set<ln>::iterator it=line.lower_bound(w);
  111. if(it!=line.end())ws[e[i].w][e[i].t-]=it->id;
  112. }
  113. x0=x1;
  114. }
  115. for(int i=;i<=n;++i)if(!vs[i].empty()){
  116. std::sort(vs[i].begin(),vs[i].end());
  117. vs[i].push_back(vs[i][]);
  118. for(int j=;j<vs[i].size();++j){
  119. merge(vs[i][j-].i2,vs[i][j].i1);
  120. }
  121. }
  122. std::sort(es+,es+m+);
  123. for(int i=;i<=m;++i){
  124. int x=get2(get(f,es[i].ID));
  125. int y=get2(get(f,es[i].ID+m));
  126. if(x&&y&&x!=y){
  127. if(h2[x]<h2[y])f2[x]=y,ee[x]=es[i].c;
  128. else{
  129. if(h2[x]==h2[y])++h2[x];
  130. f2[y]=x;ee[y]=es[i].c;
  131. }
  132. }
  133. }
  134. for(int i=;i<=q;++i){
  135. int x=get(f,ws[i][]),y=get(f,ws[i][]);
  136. if(!x||!y)puts("-1");
  137. else{
  138. int v=;
  139. while(x!=y){
  140. if(h2[x]>h2[y])std::swap(x,y);
  141. maxs(v,ee[x]);
  142. x=f2[x];
  143. }
  144. printf("%d\n",v);
  145. }
  146. }
  147. return ;
  148. }

bzoj3051: [wc2013]平面图的更多相关文章

  1. bzoj3051[WC2013]平面图(树上倍增+平面图转对偶图+扫描线)

    简要题意:二维平面上n个点,点之间有一些连线,连线不在点之外的地方相交,将平面分为若干个区域.给出一些询问点对,问从这个点所在的区域走到另一个点所在的区域的最小代价. 题解:这道题首先可以把平面图转对 ...

  2. [WC2013]平面图——平面图点定位

    [WC2013]平面图 码农题 平面图点定位: 1.平面图转对偶图:[HNOI2016]矿区 2.扫描线点定位 把所有的顶点和询问点排序,扫描线 每个边在fr的位置加入,to的位置删除,竖直直线不要 ...

  3. 【uoj57】 WC2013—平面图

    http://uoj.ac/problem/57 (题目链接) 题意 给出二位平面上n个点,点之间有一些连线,连线不在顶点之外的地方相交,将平面分为若干个区域.给出一些询问点对,问从这个点所在的区域走 ...

  4. 洛谷 P4073 [WC2013]平面图

    #include<bits/stdc++.h> using namespace std; ; typedef long double LD; ; ); int dcmp(LD x){ret ...

  5. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  6. [BZOJ1997][HNOI2010] 平面图判定

    Description Input Output     是的..BZOJ样例都没给.     题解(from 出题人): 如果只考虑简单的平面图判定,这个问题是非常不好做的. 但是题目中有一个条件— ...

  7. 【BZOJ 3051】【UOJ #57】【WC 2013】平面图

    http://www.lydsy.com/JudgeOnline/problem.php?id=3051 http://uoj.ac/problem/57 这道题需要平面图转对偶图,点定位,最小生成树 ...

  8. 【BZOJ-2007】海拔 最小割 (平面图转对偶图 + 最短路)

    2007: [Noi2010]海拔 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2095  Solved: 1002[Submit][Status] ...

  9. 【BZOJ-4423】Bytehattan 并查集 + 平面图转对偶图

    4423: [AMPPZ2013]Bytehattan Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 144  Solved: 103[Submit][ ...

随机推荐

  1. Linux 命令行快捷键

    说明 Ctrl – k: 先按住 Ctrl 键,然后再按 k 键: Alt – k: 先按住 Alt 键,然后再按 k 键: M – k:先单击 Esc 键,然后再按 k 键. 移动光标 Ctrl – ...

  2. JS控制的动态表格

    对应的js: function pccAddSignRow() { //读取最后一行的行号,存放在LearnTRLastIndex文本框中 var pccTRLastIndex = findObj(& ...

  3. _.属性和self.属性,我遇到的那些坑

    只怪当时_.属性和self.属性当时没有研究透,所以为自己掉入坑里埋下了伏笔.下面从我的坑开始说起: 我写了个懒加载,重写了一个数组属性的get方法,在get方法里面创建了一个数组来获取数据,那么调用 ...

  4. LINQ To SQL

    议程 1.LINQ To SQL概述 2.LINQ To SQL对象模型 3.LINQ To SQL查询 用到的数据库 SQL Server 2005,数据库名为Test. 两张表,分别为Studen ...

  5. jQuery的选择器中的通配符总结

    1.选择器 (1)通配符: $("input[id^='code']");//id属性以code开始的所有input标签 $("input[id$='code']&quo ...

  6. Android 学习第12课,应用出错信息

    应用在运行时,出现的错误信息都会在LogCat中显示 如果调出LogCat ? 菜单:窗口 -> 显示视图 -> 其他 -> LogCat

  7. IC卡复位应答ATR解析

    输入的是ATR,通过解析输出TA.TB.TC.TD的信息. 似乎没有容错处理,~~~~(>_<)~~~~ #include <stdio.h> #define TA_BIT ( ...

  8. getElementById,getElementsByName,getElementsByTagName的区别

    1.getElementById 作用:一般页面里ID是唯一的,用于准备定为一个元素 语法: document.getElementById(id) 参数:id :必选项为字符串(String) 返回 ...

  9. React(JSX语法)-----JSX基本语法

    JSX------HTML tags vs React Components: 1.To render a html tag,just use lower-case tag names in JSX; ...

  10. 第三篇T语言实例开发,图色操作

    ---恢复内容开始--- 图色的基本操作 1.找颜色色命令的基本操作 坐标点取色:获取指定坐标点的颜色 区域找色:在指定区域里找某一个颜色 模糊找色:在指定区域里找某一个颜色,可以设置相似度 多点找色 ...