BZOJ2960: 跨平面
从一条边出发遍历,每次找旋转角度最小的一条边作为下一条边,直到回到出发的边,就得到了一个区域。这样建出对偶图后跑不定根的最小树形图就行了。
#include<cstdio>
#include<cmath>
#include<map>
#define ub upper_bound
using namespace std;
const int N=5005;
map<double,int>s[N];
int sum,n,m,q[N],v[N];
struct edge{
int v,w;
edge*s;
}e[N*2];
edge*l=e,*h[N];
void add(int u,int v,int w){
sum+=w;
edge s={v,w,h[u]};
*(h[u]=l++)=s;
}
struct vec{
int x,y;
double a;
vec(){}
vec(int x,int y):x(x),y(y),a(atan2(y,x)){}
}a[N];
vec operator-(vec a,vec b){
return vec(a.x-b.x,a.y-b.y);
}
namespace dual{
struct edge{
int u,v,w;
}e[N*2];
edge*l=e;
void add(int u,int v,int w){
edge s={u,v,w};
*l++=s;
}
int d[N],p[N],s[N],t[N];
int find(int&v){
for(int i=1;i!=n;++i){
s[i]=0;
d[i]=1e9;
}
for(edge*i=e;i!=l;++i)
if(d[i->v]>i->w){
p[i->v]=i->u;
d[i->v]=i->w;
}
int now=0;
for(int i=1;i!=n;++i){
v+=d[i];
int u=i;
for(;u&&!s[u];u=p[u])
s[u]=i;
now+=s[u]==i;
for(;s[u]==i;u=p[u]){
s[u]=-1;
t[u]=now;
}
}
return now;
}
int sol(int v){
while(int now=find(v)){
for(int i=1;i!=n;++i)
if(~s[i])t[i]=++now;
n=now+1;
edge*q=l;
for(edge*i=l=e;i!=q;++i)
if(t[i->u]!=t[i->v])
add(t[i->u],t[i->v],i->w-d[i->v]);
}
return v;
}
}
struct buf{
char z[1<<20],*s;
buf():s(z){
z[fread(z,1,sizeof z,stdin)]=0;
}
operator int(){
int x=0,y=0;
while(*s<48)
if(*s++==45)y=1;
while(*s>32)
x=x*10+*s++-48;
return y?-x:x;
}
}it;
int sol(){
for(int i=1;i<=n;++i)
for(edge*j=h[i];j;j=j->s)
s[i][(a[j->v]-a[i]).a]=j-e;
for(int i=1;i<=n;++i)
for(edge*j=h[i];j;j=j->s){
typeof(s->end())u=s[j->v].ub((a[i]-a[j->v]).a);
if(s[j->v].end()==u)
u=s[j->v].begin();
q[j-e]=u->second;
}
using dual::add;
using dual::sol;
int&now=n=1;
for(edge*i=e;i!=l;++i)
if(!v[i-e]){
for(int j=i-e;!v[j];j=q[j])
v[j]=now;
add(0,now++,sum);
}
for(edge*i=e;i!=l;++i)
if(i->w)
add(v[i-e^1],v[i-e],i->w);
return sol(-sum);
}
int main(){
n=it,m=it;
for(int i=1;i<=n;++i){
a[i].x=it;
a[i].y=it;
}
while(m--){
int s=it,t=it;
add(s,t,it);
add(t,s,it);
}
printf("%d\n",sol());
}
BZOJ2960: 跨平面的更多相关文章
- BZOJ2960:跨平面
题面 BZOJ Sol 对该平面图的对偶图建图后就是最小树形图,建一个超级点向每个点连 \(inf\) 边即可 怎么转成对偶图,怎么弄出多边形 把边拆成两条有向边,分别挂在两个点上 每个点的出边按角度 ...
- 高速LVDS电平简介
一.LVDS简介 1.1.LVDS信号介绍LVDS:Low Voltage Differential Signaling,低电压差分信号.LVDS传输支持速率一般在155Mbps(大约为77MHZ)以 ...
- PCB设计工程师面试题
网上的一套PCB设计工程师面试题,测下你能不能拿90分? [复制链接] 一.填空 1.PCB上的互连线按类型可分为()和() . 2.引起串扰的两个因素是()和(). 3.EMI ...
- layout焊盘过孔大小的设计标准
PCB设计前准备 1.准确无误的原理图.包括完整的原理图文件和网表,带有元件编码的正式的BOM.原理图中所有器件的PCB封装(对于封装库中没有的元件,硬件工程师应提供datasheet或者实物,并指定 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 最小割&网络流应用
重要链接 基础部分链接 : 二分图 & 网络流初步 zzz大佬博客链接 : 网络流学习笔记 重点内容:最小割二元关系新解(lyd's ppt) 题目:网络流相关题目 lyd神犇课件链接 : 网 ...
- 平面内,线与线 两条线找交点 两条线段的位置关系(相交)判定与交点求解 C#
个人亲自编写.测试,可以正常使用 道理看原文,这里不多说 网上找到的几篇基本都不能用的 C#代码 bool Equal(float f1, float f2) { return (Math ...
- 在路上:安全公司“跨界”SD-WAN
编者按:本文是SDNLAB“企业+”特别报道之一.“企业+”是SDNLAB重点打造的栏目,汇聚信息行业运营商.设备商.互联网公司.软件公司.集成公司.融创投资公司.科研院所等企业,重新定义IT行业撮合 ...
- Luogu P1429 平面最近点对 【分治】By cellur925
题目传送门 题目大意:给定平面上n个点,找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的.$n$<=100000. $Algorithm$ 最朴素的$n^2$枚举肯定 ...
随机推荐
- 一个奇妙的java坑:Long 类型的比较
Long userId=127L; Long authorId=127L; System.out.println(userId==authorId);//true userId=128L; autho ...
- HTML5基础知识(3)--required属性
1.required属性规定在提交之前要填写输入域(不能为空). 2.代码 <body> <form> 账号:<input type="text" r ...
- 在Ubuntu 14.04中安装最新版Eclipse
1.下载eclipse从官网http://www.eclipse.org/downloads/下载Eclipse IDE for Java EE Developers的Linux版本eclipse-S ...
- centos 20T硬盘(超过16T)分区
最近新买了一台服务器DELL R730 首先我们做了一个raid 1 和raid 5 在raid 1 上安装系统 安装完系统之后,现在要进行分区了,那个raid 5 做完之后,实际大小是19T 所以这 ...
- IntelliJ_设置
1.修改背景色.修改字体大小 http://blog.csdn.net/hpf911/article/details/16888797 2.显示行号 搜索Line Number 3.代码结构图 Vie ...
- C++中的重载隐藏覆盖&&JAVA中的重载覆盖&&多态
class 类继承默认是private, struct 默认继承是public C++中的隐藏: 只要派生类中出现和基类一样的函数名,基类中的函数就会被派生类中的函数给隐藏(如果派生类和基类中的函数名 ...
- 状态压缩codeforces 11 D
n个点m条边 m条边 求有几个环; #pragma comment(linker, "/STACK:102400000,102400000") #include <iostr ...
- 微信支付系列(2)——jsapi支付源码解析
版权声明:转载请注明出处:http://blog.csdn.net/m0sh1 http://www.share345.com 在微信支付 开发者文档页面 下载最新的 PHP SDK http://m ...
- 【CodeForces 567E】President and Roads(最短路)
Description Berland has n cities, the capital is located in city s, and the historic home town of th ...
- [vijos1002][NOIP2005]过河
Description 给定一条数轴,起点为0,数轴的某些整数点上有石子.每次可以移动的区间为[S,T].求当到达或超过L时,最少踩到的石子数. Input 输入的第一行有一个正整数L(1 <= ...