题目链接

题意:有n架飞机,每架飞机有两个着陆时间点可以选,要求任意两架飞机的着陆时间之差不超过k,求k的最大值。

解法:由于每架飞机都有两个选择,并且必选且只能选其中一个,时间冲突也是发生在两架飞机之间的,因此二分答案,对冲突的时间建边处理,然后跑2SAT即可。

 #include<cstdio>
#include<cstring>
#include<algorithm> using namespace std;
const int N=+;
struct E {
int v,nxt;
} e[N*N];
int n,hd[N],ne;
void init() {memset(hd,-,sizeof hd); ne=;}
void addedge(int u,int v) {e[ne]= {v,hd[u]},hd[u]=ne++;} int dfn[N],low[N],scc[N],sta[N],nscc,nsta,tot;
void dfs(int u) {
dfn[u]=low[u]=++tot;
sta[nsta++]=u;
for(int i=hd[u]; ~i; i=e[i].nxt) {
int v=e[i].v;
if(!dfn[v])dfs(v),low[u]=min(low[u],low[v]);
else if(!scc[v])low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u]) {
nscc++;
for(; !scc[u]; scc[sta[--nsta]]=nscc);
}
}
void getscc() {
memset(dfn,,sizeof dfn);
memset(scc,,sizeof scc);
tot=nscc=nsta=;
for(int i=; i<n*; ++i)if(!dfn[i])dfs(i);
} int x[N],y[N];
int p1(int x) {return x<<;}
int p2(int x) {return x<<|;} bool ok(int k) {
init();
for(int i=; i<n; ++i)
for(int j=i+; j<n; ++j) {
if(abs(x[i]-x[j])<k)addedge(p1(i),p2(j)),addedge(p1(j),p2(i));
if(abs(x[i]-y[j])<k)addedge(p1(i),p1(j)),addedge(p2(j),p2(i));
if(abs(y[i]-x[j])<k)addedge(p2(i),p2(j)),addedge(p1(j),p1(i));
if(abs(y[i]-y[j])<k)addedge(p2(i),p1(j)),addedge(p2(j),p1(i));
}
getscc();
for(int i=; i<n; ++i)if(scc[p1(i)]==scc[p2(i)])return false;
return true;
} int bi(int l,int r) {for(int mid; l<r; mid=(l+r+)>>,ok(mid)?l=mid:r=mid-); return l;} int main() {
while(scanf("%d",&n)==) {
for(int i=; i<n; ++i)scanf("%d%d",&x[i],&y[i]);
printf("%d\n",bi(,(int)1e7));
}
return ;
}

UVALive - 3211 Now or later (二分+2SAT)的更多相关文章

  1. UVa 3211 Now or later (二分+2-Sat)

    题意:有 n 架飞机,每个飞机早着陆,或者晚着陆,让你安排一个方式,让他们着陆的时间间隔尽量大. 析:首先对于时间间隔,可以用二分来解决,然后就成了一个判定性问题,然后怎么判断该时间间隔是不是成立呢, ...

  2. UVALive 3211 Now or later(2-sat)

    2-sat问题,一种在两种可能性中选择必然关系的问题. 推荐两篇论文,也是学2-sat公认比较好的材料.前者较好理解,后者需耐心看. http://www.google.com.hk/url?sa=t ...

  3. UVALive 3211 Now or Later (2-SAT)

    题目的要求一个最小值最大,二分即可,但是怎么判断呢? 飞机早或者晚两种状态,可以用一个布尔变量表示,假设当前猜测为m,那么根据题意, 如果x和y所对应的时间冲突那么就是¬(xΛy)化成或的形式(¬x) ...

  4. UVALive 3211 : Now or later 【2-SAT】

    题目链接 题意及题解参见lrj训练指南 #include<bits/stdc++.h> using namespace std; ; struct TwoSAT { int n; vect ...

  5. UVALive - 3211 (2-SAT + 二分)

    layout: post title: 训练指南 UVALive - 3211 (2-SAT + 二分) author: "luowentaoaa" catalog: true m ...

  6. UVALive - 3211 - Now or later(图论——2-SAT)

    Problem   UVALive - 3211 - Now or later Time Limit: 9000 mSec Problem Description Input Output Sampl ...

  7. 2-sat基础题 uvalive 3211

    蓝书325页的基础题 二分+2-sat //看看会不会爆int!数组会不会少了一维! //取物问题一定要小心先手胜利的条件 #include <bits/stdc++.h> using n ...

  8. HDU 3622 Bomb Game(二分+2SAT)

    题意:有一个游戏,有n个回合,每回合可以在指定的2个区域之一放炸弹,炸弹范围是一个圈,要求每回合的炸弹范围没有重合.得分是炸弹半径最小的值.求可以得到的最大分数. 思路:二分+2SAT. 二分炸弹范围 ...

  9. hdu 3622 二分+2-sat

    /* 二分+2-sat 题意:在一个二维平面上给你n个炸弹,和2*n个位置,每一行的两个位置只能有一个放炸弹 现在炸弹爆炸有一个半径,当炸弹爆炸时两个炸弹的半径化成的圆不能相交,求最大半径 二分半径, ...

随机推荐

  1. loadrunner脚本篇——Run-time Settings之ContentCheck

    运用场景(很少用到): ContentCheck的设置可用来让VuGen检测存在错误的站点页面.如果被测的Web应用没有使用自定义的错误页面,那么这里不用添加规则,因为LR在回放时候,可以默认的捕捉到 ...

  2. swift的值类型和引用类型

    前言 最近在学设计模式中,发现 Swift 中的 struct,class 以及 enum 在一般的使用中能够做到互相替换,因此探究其背后的逻辑就十分有必要.而这一问题又引出了 Swift 中的值类型 ...

  3. Springboot WebSocket例子

    Springboot整合WebSocket 1.application.properties #设置服务端口号 server.port=8080 #thymeleaf配置 #是否启用模板缓存. spr ...

  4. 树莓派打造对话机器人 Python(转)

    工具列表 1. **树莓派**(型号不要求,本人使用的是3B) 2. **usb麦克风**(某宝有卖,我就不打广告了) 用来录音 3. **音响或者喇叭**(某宝也有卖) 用来播放 以上就是需要的工具 ...

  5. 解决Newtonsoft.Json版本问题

    在配置文件中添加以下代码,App.config或Web.config <runtime> <assemblyBinding xmlns="urn:schemas-micro ...

  6. Variation calling and annotation

    Resequencing 302 wild and cultivated accessions identifies genes related to domestication and improv ...

  7. java深入探究13-js,ajax

    链接:http://pan.baidu.com/s/1c2D0cAs 密码:uwm6 1.js 1)三种基本类型: var num=100; var str="哈哈"; var f ...

  8. whois老域名挖掘技术

    我一般通过站长工具域名WHOIS查询定向收集一些特定域名,拿来分析网站存活站点. 例如: 查询域名基本信息 WHOIS反查得到大部分域名注册信息 一般大一点的厂商都有几百个域名,我们通过此处收集大量顶 ...

  9. 修改SpringBoot 默认的小叶子图标

    Springboot 项目,在浏览器中访问时,浏览器上导航栏的图标是一片绿色的叶子,我们可以修改它. 将格式为.ico的图片放入以下任一项目文件夹即可.但,图片命名必须为favicon.ico 1.类 ...

  10. numpy里*与dot与multiply

    一.*  , dot()   multiply() 1, 对于array来说,(* 和 dot()运算不同, * 和 multiply()运算相同) *和multiply() 是每个元素对应相乘 do ...