bzoj3051: [wc2013]平面图
Description

Input

Output

扫描线求出平面图的对偶图然后求最小生成树,用并查集按秩合并,以便查询两点间路径最大权
#include<stdio.h>
#include<algorithm>
#include<vector>
#include<set>
#include<cmath>
int f[],f2[],h2[];
int get(int*f,int x){
int a=x,c;
while(x!=f[x])x=f[x];
while(x!=f[a])c=f[a],f[a]=x,a=c;
return x;
}
int get2(int x){
while(x!=f2[x])x=f2[x];
return x;
}
void merge(int a,int b){
a=get(f,a);b=get(f,b);
if(a<b)f[b]=a;
else f[a]=b;
}
double X;
struct ln{
double k,b;int id;
double operator()(double x)const{return k*x+b;}
bool operator<(ln w)const{return operator()(X)+1e-<w(X);}
};
std::set<ln>line;
struct pos{
double x,y;
void R(){
scanf("%lf%lf",&x,&y);
}
}ps[],qs[][];
struct dir{
double d;
int i1,i2;
bool operator<(dir w)const{return d<w.d;}
};
std::vector<dir>vs[];
struct ev{
int t;
double x;
int w;
bool operator<(ev a)const{return x!=a.x?x<a.x:t<a.t;}
}e[];
int ep=,ee[];
int n,m,q;
struct edge{
int a,b,c,ID;
ln l;
void R(int I){
ID=I;
scanf("%d%d%d",&a,&b,&c);
if(ps[a].x>ps[b].x)std::swap(a,b);
if(ps[a].x!=ps[b].x){
e[ep++]=(ev){,ps[a].x,I};
e[ep++]=(ev){,ps[b].x,I};
double k=(ps[b].y-ps[a].y)/(ps[b].x-ps[a].x);
l=(ln){k,ps[a].y-ps[a].x*k,I};
}
vs[a].push_back((dir){atan2(ps[b].y-ps[a].y,ps[b].x-ps[a].x),I,I+m});
vs[b].push_back((dir){atan2(ps[a].y-ps[b].y,ps[a].x-ps[b].x),I+m,I});
}
bool operator<(const edge&w)const{return c<w.c;}
}es[];
int ws[][];
void maxs(int&a,int b){if(a<b)a=b;}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=m*;++i)f[i]=f2[i]=i;
for(int i=;i<=n;++i)ps[i].R();
for(int i=;i<=m;++i)es[i].R(i);
scanf("%d",&q);
for(int i=;i<=q;++i){
qs[i][].R();
qs[i][].R();
e[ep++]=(ev){,qs[i][].x,i};
e[ep++]=(ev){,qs[i][].x,i};
}
std::sort(e,e+ep);
e[ep].x=e[ep-].x+;
double x0=e[].x-,x1;
for(int i=,j=;i<ep;){
x1=e[i].x;
for(;j<ep&&e[j].x==x1;++j);
X=(x0+x1)/.;
for(;i<j&&e[i].t==;++i){
std::set<ln>::iterator it=line.find(es[e[i].w].l);
line.erase(it);
}
X=(x1+e[j].x)/.;
for(int k=i;k<j&&e[k].t==;++k){
ln w=es[e[k].w].l;
line.insert(w);
}
for(;i<j&&e[i].t==;++i){
ln w=es[e[i].w].l;
std::set<ln>::iterator it=line.find(w);
++it;
if(it==line.end())merge(,e[i].w+m);
else merge(e[i].w+m,it->id);
--it;
if(it==line.begin())merge(,e[i].w);
else --it,merge(e[i].w,it->id+m);
}
X=x1;
for(;i<j;++i){
ln w=(ln){,qs[e[i].w][e[i].t-].y,};
std::set<ln>::iterator it=line.lower_bound(w);
if(it!=line.end())ws[e[i].w][e[i].t-]=it->id;
}
x0=x1;
}
for(int i=;i<=n;++i)if(!vs[i].empty()){
std::sort(vs[i].begin(),vs[i].end());
vs[i].push_back(vs[i][]);
for(int j=;j<vs[i].size();++j){
merge(vs[i][j-].i2,vs[i][j].i1);
}
}
std::sort(es+,es+m+);
for(int i=;i<=m;++i){
int x=get2(get(f,es[i].ID));
int y=get2(get(f,es[i].ID+m));
if(x&&y&&x!=y){
if(h2[x]<h2[y])f2[x]=y,ee[x]=es[i].c;
else{
if(h2[x]==h2[y])++h2[x];
f2[y]=x;ee[y]=es[i].c;
}
}
}
for(int i=;i<=q;++i){
int x=get(f,ws[i][]),y=get(f,ws[i][]);
if(!x||!y)puts("-1");
else{
int v=;
while(x!=y){
if(h2[x]>h2[y])std::swap(x,y);
maxs(v,ee[x]);
x=f2[x];
}
printf("%d\n",v);
}
}
return ;
}
bzoj3051: [wc2013]平面图的更多相关文章
- bzoj3051[WC2013]平面图(树上倍增+平面图转对偶图+扫描线)
简要题意:二维平面上n个点,点之间有一些连线,连线不在点之外的地方相交,将平面分为若干个区域.给出一些询问点对,问从这个点所在的区域走到另一个点所在的区域的最小代价. 题解:这道题首先可以把平面图转对 ...
- [WC2013]平面图——平面图点定位
[WC2013]平面图 码农题 平面图点定位: 1.平面图转对偶图:[HNOI2016]矿区 2.扫描线点定位 把所有的顶点和询问点排序,扫描线 每个边在fr的位置加入,to的位置删除,竖直直线不要 ...
- 【uoj57】 WC2013—平面图
http://uoj.ac/problem/57 (题目链接) 题意 给出二位平面上n个点,点之间有一些连线,连线不在顶点之外的地方相交,将平面分为若干个区域.给出一些询问点对,问从这个点所在的区域走 ...
- 洛谷 P4073 [WC2013]平面图
#include<bits/stdc++.h> using namespace std; ; typedef long double LD; ; ); int dcmp(LD x){ret ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- [BZOJ1997][HNOI2010] 平面图判定
Description Input Output 是的..BZOJ样例都没给. 题解(from 出题人): 如果只考虑简单的平面图判定,这个问题是非常不好做的. 但是题目中有一个条件— ...
- 【BZOJ 3051】【UOJ #57】【WC 2013】平面图
http://www.lydsy.com/JudgeOnline/problem.php?id=3051 http://uoj.ac/problem/57 这道题需要平面图转对偶图,点定位,最小生成树 ...
- 【BZOJ-2007】海拔 最小割 (平面图转对偶图 + 最短路)
2007: [Noi2010]海拔 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2095 Solved: 1002[Submit][Status] ...
- 【BZOJ-4423】Bytehattan 并查集 + 平面图转对偶图
4423: [AMPPZ2013]Bytehattan Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 144 Solved: 103[Submit][ ...
随机推荐
- Mac下搭建php开发环境【转】
Mac OS X 内置了Apache 和 PHP,这样使用起来非常方便.本文以Mac OS X 10.6.3为例.主要内容包括: 启动Apache 运行PHP 安装MySQL 使用phpMyAdmin ...
- TopCoder比赛总结表
TopCoder 250 500 ...
- [转]透过 Linux 内核看无锁编程
非阻塞型同步 (Non-blocking Synchronization) 简介 如何正确有效的保护共享数据是编写并行程序必须面临的一个难题,通常的手段就是同步.同步可分为阻塞型同步(Blocking ...
- EM界面 ORA-12505: TNS: 监听程序当前无法识别连接描述符中所给出的 SID (DBD ERROR: OCIServerAttach)
我的是10g,打开EM,另外都正常,就有这个问题到实例的代理连接 状态 失败 详细资料 ORA-12505: TNS: 监听程序当前无法识别连接描述符中所给出的 SID (DBD ERROR: OCI ...
- 《JavaScript_DOM编程艺术第二版(中文)》整书笔记
目录 第3章:DOM 第4章:案例研究 第5章:最佳实践 第6章:案例改进 第7章:动态创建标记 第8章:充实文档的内容 第9章:CSS-DOM 第3章:DOM 文档:DOM中的"D&quo ...
- 【JS】HTMLprop与attr的区别
与prop一样attr也可以用来获取与设置元素的属性.区别在于,对于自定义属性和选中属性的处理.选中属性指的是 checked,selected 这2种属性1. 对于自定义属性 attr能够获取,pr ...
- C#编程语言与面向对象——类与对象
由于ASP.NET技术是全面向对象的,因此,要掌握这一技术,必须具备有扎实的面向对象理论基础 使用C#编程,所有的程序代码几乎都放在类中,不存在独立于类中之外的函数,因此,类是面向对象编程的基本单元 ...
- Servlet---RequestDispatcher.include方法
为了实现代码重用,需要将某些代码和数据放在一个或多个Servlet中,以供其他Servlet使用,提供了RequestDispatcher.include方法,首先通过getServletContex ...
- java 队列基础操作
http://www.cnblogs.com/fuck1/p/5996116.html 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别 ...
- win10删除或更改需要SYSTEM或Administrators权限的文件夹
有时候我们需要删除一些系统文件夹或者文件,但是却经常会出现如下提示: 遇到这些情况,我们可以采用如下的解决手段. 一.右键单击需要更改或删除的文件夹,选择属性. 二.在弹出的窗口菜单里,选择“安全”选 ...