二分答案 + 2-SAT验证

POJ 稳过,HDU C++ 超时,G++ 550ms左右AC

#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<stack>
#include<algorithm>
using namespace std; const int maxn=+;
int N,A,B;
int left,right,mid;
int s1x,s1y,s2x,s2y;
struct point
{
int x,y;
int p_s1;
int p_s2;
}p[maxn];
int Hx[maxn],Hy[maxn];
int Lx[maxn],Ly[maxn]; stack<int>S;
vector<int>G[maxn];
vector<int>FG[maxn];
int Belong[maxn];
int flag[maxn];
int Block; int dis1,dis2,dis3; void init()
{
for(int i=;i<maxn;i++) G[i].clear();
for(int i=;i<maxn;i++) FG[i].clear();
memset(Belong,,sizeof Belong);
memset(flag,,sizeof flag);
while(!S.empty()) S.pop();
Block=;
} void addEgde(int x,int y)
{
G[x].push_back(y);
FG[y].push_back(x);
} int Dis(int x1,int y1,int x2,int y2)
{
return abs(x1-x2)+abs(y1-y2);
} void read()
{
scanf("%d%d%d%d",&s1x,&s1y,&s2x,&s2y);
for(int i=;i<N;i++)
scanf("%d%d",&p[i].x,&p[i].y);
for(int i=;i<=A;i++)
{
scanf("%d%d",&Hx[i],&Hy[i]);
Hx[i]--;Hy[i]--;
}
for(int i=;i<=B;i++)
{
scanf("%d%d",&Lx[i],&Ly[i]);
Lx[i]--;Ly[i]--;
}
} void dfs1(int now)
{
flag[now]=;
for(int i=;i<G[now].size();i++)
if(!flag[G[now][i]])
dfs1(G[now][i]);
S.push(now);
} void dfs2(int now)
{
Belong[now]=Block;
for(int i=;i<FG[now].size();i++)
if(!Belong[FG[now][i]])
dfs2(FG[now][i]);
} bool judge()
{
for(int i=;i<*N;i++) if(!flag[i]) dfs1(i);
while(!S.empty())
{
int Top=S.top(); S.pop();
if(!Belong[Top])
{
Block++;
dfs2(Top);
}
}
for(int i=;i<N;i++)
if(Belong[*i]==Belong[*i+])
return ;
return ;
} void solve()
{
left=;right=;
int ans=-;
while(left<=right)
{
mid=(left+right)/;
init(); for(int i=;i<N;i++){
for(int j=i+;j<N;j++)
{
int pi_s1=p[i].p_s1;
int pi_s2=p[i].p_s2;
int pj_s1=p[j].p_s1;
int pj_s2=p[j].p_s2;
int s1_s2=Dis(s1x,s1y,s2x,s2y); if(pi_s1+pj_s1>mid) {
addEgde(*i,*j+);
addEgde(*j,*i+);
} if(pi_s2+pj_s2>mid) {
addEgde(*i+,*j);
addEgde(*j+,*i);
} if(pi_s1+s1_s2+pj_s2>mid) {
addEgde(*i,*j);
addEgde(*j+,*i+);
} if(pi_s2+s1_s2+pj_s1>mid) {
addEgde(*i+,*j+);
addEgde(*j,*i);
}
} } for(int i=;i<=A;i++)
{
addEgde(*Hx[i],*Hy[i]+);
addEgde(*Hy[i]+,*Hx[i]);
addEgde(*Hx[i]+,*Hy[i]);
addEgde(*Hy[i],*Hx[i]+);
}
for(int i=;i<=B;i++)
{
addEgde(*Lx[i],*Ly[i]);
addEgde(*Ly[i],*Lx[i]);
addEgde(*Lx[i]+,*Ly[i]+);
addEgde(*Ly[i]+,*Lx[i]+);
}
if(judge()) ans=mid,right=mid-;
else left=mid+;
}
printf("%d\n",ans);
}
int main()
{
while(~scanf("%d%d%d",&N,&A,&B))
{
read();
for(int i=;i<N;i++)
{
p[i].p_s1=Dis(p[i].x,p[i].y,s1x,s1y);
p[i].p_s2=Dis(p[i].x,p[i].y,s2x,s2y);
}
solve();
}
return ;
}

HDU 1815 Building roads的更多相关文章

  1. HDU 3721 Building Roads (2010 Asia Tianjin Regional Contest) - from lanshui_Yang

    感慨一下,区域赛的题目果然很费脑啊!!不过确实是一道不可多得的好题目!! 题目大意:给你一棵有n个节点的树,让你移动树中一条边的位置,即将这条边连接到任意两个顶点(边的大小不变),要求使得到的新树的直 ...

  2. HDU 1815, POJ 2749 Building roads(2-sat)

    HDU 1815, POJ 2749 Building roads pid=1815" target="_blank" style="">题目链 ...

  3. poj 3625 Building Roads

    题目连接 http://poj.org/problem?id=3625 Building Roads Description Farmer John had just acquired several ...

  4. poj 2749 Building roads (二分+拆点+2-sat)

    Building roads Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6229   Accepted: 2093 De ...

  5. BZOJ 1626: [Usaco2007 Dec]Building Roads 修建道路( MST )

    计算距离时平方爆了int结果就WA了一次...... ------------------------------------------------------------------------- ...

  6. HDU 1102 Constructing Roads, Prim+优先队列

    题目链接:HDU 1102 Constructing Roads Constructing Roads Problem Description There are N villages, which ...

  7. HDU 5033 Building(单调栈)

    HDU 5033 Building(单调栈) 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5033 Description Once upon a ti ...

  8. Building roads

    Building roads Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...

  9. HDU—— 5159 Building Blocks

    Problem Description After enjoying the movie,LeLe went home alone. LeLe decided to build blocks. LeL ...

随机推荐

  1. Redhat_AS5下安装MySQL5.0总结

    一.引言 使用Linux也有几年时间了,由于公司要做radius服务器用用到MySQL.从网上找了些资料. 二.安装Mysql 1.下载MySQL的安装文件 安装MySQL需要下面两个文件: MySQ ...

  2. JS进阶书籍

    http://blog.csdn.net/bingqingsuimeng/article/details/40535291 本来想尝试每天回答或看已解决的3个问题来学习总结今天的知识点,看了下博文里面 ...

  3. rebot framework的搭建 在windows下

    Robot Framework 介绍 Robot Framework 是一款基于 Python 的功能自动化测试框架.它具备良好的可扩展性,支持关键字驱动,可以同时测试多种类型的客户端或者接口,可以进 ...

  4. 设置标题小图标ico

    在head里添加 <link rel="shortcut icon" href="<%=request.getContextPath()%>/FlatU ...

  5. 路由器wan口连接不上的问题

    路由器:tp-link:系统:win8.1:网络类型:PPPoE 克隆“当前管理PC的MAC地址”后,无法连接,将网线直接连到电脑上可以连接,所以问题一定出在路由上,经过不断探索发现问题所在,通过命令 ...

  6. CentOS6.6 部署Apache+Svn

    svn代码 目前大多数公司 管理代码都是用这个 这个比较方便简单,git用的人数也比较多,我们下面来部署一下这个程序 svn+apache集成 系统环境 # cat /etc/redhat-relea ...

  7. c语言库函数

    #include <stdio.h> #define LENGTH 100 main() { FILE *fd; char str[LENGTH]; fd = fopen("he ...

  8. JSTL判断list的size()大小

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ tag ...

  9. bash和sh区别

    在一般的linux系统当中(如redhat),使用sh调用执行脚本相当于打开了bash的POSIX标准模式(等效于bash的 --posix 参数),一般的,sh是bash的“子集”,不是子集的部分. ...

  10. java int和Integer的区别

    今天偶然和同学讨论到int和Integer的区别是,发现自己对这个问题了解的并不是很清楚,而且有些概念还是错的,所以在这对int和Integer的区别做一个总结. int与integer的区别从大的方 ...