题意:

有n个点需要摆在一个数轴上,每个点需要摆在ai这个位置或者bi上,问怎么摆能使数轴上相邻两个点之间的距离的最小值最大。

二分答案后显然是个2-sat判定问题,因为边很多而连边的又是一个区间,所以可以线段树优化连边。

#include<bits/stdc++.h>
#define ls x<<1,l,mid
#define rs x<<1|1,mid+1,r
#define N 500005
#define M 2000005
using namespace std;
int n;
int head[N],ver[M],nxt[M],tot;
void add(int a,int b)
{
tot++;nxt[tot]=head[a];head[a]=tot;ver[tot]=b;return ;
}
int low[N],in[N],top,st[N],dfn[N],be[N],num,tim;
void trjan(int x)
{
low[x]=dfn[x]=++tim;
st[++top]=x;
in[x]=1;
for(int i=head[x];i;i=nxt[i])
{
if(!dfn[ver[i]])
{
trjan(ver[i]);
low[x]=min(low[x],low[ver[i]]);
}
else if(in[ver[i]])low[x]=min(low[x],dfn[ver[i]]);
}
if(low[x]==dfn[x])
{
int y;num++;
do
{
y=st[top--];
in[y]=0;
be[y]=num;
}while(y!=x);
}
return ;
}
struct nd
{
int x,id;
friend bool operator < (const nd &aa,const nd &bb)
{
return aa.x<bb.x;
}
}a[N];
int tt,mx;
int fan[N];
void build(int x,int l,int r)
{
mx=max(mx,x);
if(l==r)
{
add(x+tt,fan[a[l].id]);
return ;
}
int mid=(l+r)>>1;
add(x+tt,x*2+tt);
add(x+tt,x*2+1+tt);
build(ls);build(rs);
}
void add(int x,int l,int r,int ll,int rr,int ps)
{
if(l>=ll&&r<=rr)
{
add(ps,x+tt);
return ;
}
int mid=(l+r)>>1;
if(ll<=mid)add(ls,ll,rr,ps);
if(rr>mid)add(rs,ll,rr,ps);
}
bool pan(int x)
{
memset(dfn,0,sizeof(dfn));
memset(head,0,sizeof(head));
tot=tim=num=0;
build(1,1,tt);
int l=1,r=1;
for(int i=1;i<=tt;i++)
{
while(l<i&&a[i].x-a[l].x>=x)l++;
while(r<=tt&&a[r+1].x-a[i].x<x)r++;
//cout<<l<<' '<<r<<endl;
if(l!=i)add(1,1,tt,l,i-1,a[i].id);
if(r!=i)add(1,1,tt,i+1,r,a[i].id);
}
for(int i=1;i<=tt+mx;i++)if(!dfn[i])trjan(i);
for(int i=1;i<=tt;i++)if(be[i]==be[fan[i]])return 0;
return 1;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
int t1,t2;cin>>t1>>t2;
a[++tt].x=t1;a[tt].id=tt;
a[++tt].x=t2;a[tt].id=tt;
fan[tt-1]=tt;fan[tt]=tt-1;
}
sort(a+1,a+tt+1);
int l=0,r=1000000000;
while(l<=r)
{
int mid=(l+r)>>1;
if(pan(mid))l=mid+1;
else r=mid-1;
}
//cout<<pan(0);
printf("%d\n",r);
return 0;
}

  

AtCoder Regular Contest 069 F - Flags的更多相关文章

  1. AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图

    AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图 链接 AtCoder 大意 在数轴上放上n个点,点i可能的位置有\(x_i\)或者\(y_i\ ...

  2. AtCoder Regular Contest 069

    1. C - Scc Puzzle 计算scc的个数,先判断s个数需要多少个cc,多的cc,每四个可以组成一个scc.注意数据范围,使用long long. #include<bits/stdc ...

  3. AtCoder Regular Contest 074 F - Lotus Leaves

    题目传送门:https://arc074.contest.atcoder.jp/tasks/arc074_d 题目大意: 给定一个\(H×W\)的网格图,o是可以踩踏的点,.是不可踩踏的点. 现有一人 ...

  4. AtCoder Regular Contest 081 F - Flip and Rectangles

    题目传送门:https://arc081.contest.atcoder.jp/tasks/arc081_d 题目大意: 给定一个\(n×m\)的棋盘,棋盘上有一些黑点和白点,每次你可以选择一行或一列 ...

  5. AtCoder Regular Contest 069 D

    D - Menagerie Time limit : 2sec / Memory limit : 256MB Score : 500 points Problem Statement Snuke, w ...

  6. AtCoder Regular Contest 069 D - Menagerie 枚举起点 模拟递推

    arc069.contest.atcoder.jp/tasks/arc069_b 题意:一堆不明身份的动物排成一圈,身份可能是羊或狼,羊一定说实话,狼一定说假话.大家各自报自己的两边是同类还是不同类, ...

  7. AtCoder Regular Contest 066 F Contest with Drinks Hard

    题意: 你现在有n个题目可以做,第i个题目需要的时间为t[i],你要选择其中的若干题目去做.不妨令choose[i]表示第i个题目做不做.定义cost=∑(i<=n)∑(i<=j<= ...

  8. AtCoder Regular Contest 076 F - Exhausted?

    题意: n个人抢m个凳子,第i个人做的位置必须小于li或大于ri,问最少几个人坐不上. 这是一个二分图最大匹配的问题,hall定理可以用来求二分图最大匹配. 关于hall定理及证明,栋爷博客里有:ht ...

  9. AtCoder Regular Contest 067 F - Yakiniku Restaurants

    题意: 有n个餐厅排成一排,第i个与第i+1个之间距离是Ai. 有m种食物,每种食物只能在一个餐厅里吃,第j种食物在第i个餐厅里吃的收益是$b[i][j]$. 选择每种食物在哪个餐厅里吃,使收益减去走 ...

随机推荐

  1. c# 无边框窗体的边框阴影

    Windows API: using System; using System.Collections.Generic; using System.ComponentModel; using Syst ...

  2. 2017-2018-2 《网络对抗技术》 20155302 第二周 Exp1 PC平台逆向破解(5)M

    2017-2018-2 <网络对抗技术> 20155302 第二周 Exp1 PC平台逆向破解(5)M 1-实践目标 1.1-实践介绍 本次实践的对象是一个名为pwn1的linux可执行文 ...

  3. 2017-2018-1 20155320 嵌入式C语言——时钟

    2017-2018-1 20155320 嵌入式C语言--时钟 要求: 在作业本上完成附图作业,要认真看题目要求. 提交作业截图 作弊本学期成绩清零(有雷同的,不管是给别人传答案,还是找别人要答案都清 ...

  4. arm学习之汇编跳转指令总结

    目前所知道的跳转指令有 b,bl,bep,bne.他们共同点是都是以b开头,首先从字面上分析:b:是Branch,表示分支.bl:是Branch Link表示带连接的分支.bep:Branch ,Eq ...

  5. 汇编 fsub ,fmul,fdiv,fild,CVTTPS2PI 指令

    知识点:  浮点指令 fsub 一.浮点指令fsub 格式 fsub memvar // st0=st0-memvar 知识点:  浮点指令 fmul 一.浮点指令fmul 格式 fmul mem ...

  6. 能帮我们学习吉他的音乐软件——Guitar Pro

    Guitar Pro是一款十分好用的吉他软件,也是目前广大音乐爱好者最喜欢的多音轨的音谱编辑软件.支持MIDI.MusicXML.PTB.GTP等多种格式文件的导入/导出. Guitar Pro 7. ...

  7. 小程序swiper组件高度自适应【转载】

    最近在做小程序开发,复制官方文档上的swiper组件实测后发现,图片不能自适应.网上找了几个版本测试都发现存在一些小问题,目前这个版本本人实测是最好用的.记录一下,方便日后使用. 感谢原创大神的帮助, ...

  8. android开发之使用SQLite数据库存储

    http://blog.csdn.net/jason0539/article/details/16360835 SQLite 介绍 SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且 ...

  9. Linux内核分析——第六周学习笔记

    进程的描述和进程的创建 前言:以下笔记除了一些讲解视频中的概念记录,图示.图示中的补充文字.总结.分析.小结部分均是个人理解.如有错误观点,请多指教! PS.实验操作会在提交到MOOC网站的博客中写.

  10. 第二个Sprint冲刺第 八天(燃尽图)

    因为今天停电了,所以我们也休息一天!