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

链接

AtCoder

大意

在数轴上放上n个点,点i可能的位置有\(x_i\)或者\(y_i\)

思路

首先最大值最小,考虑二分答案。

如何check呢。

只有两个坐标,考虑2-sat.

可是边有点多,存不下来,考虑线段树优化建图。

如何建图。

先按照做坐标排序,我们有两个点的范围

[id[x]-mid,id[x]+mid],[id[y]-mid,id[y]+mid]。

这个显然是z选了,区间内就不选,那就选另一个喽。

连区间的补集是不明智的,连点的补集。

细节

这里build直接交换了两个点的位置,%Refun

代码

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N=1e6+7;
  4. int read() {
  5. int x=0,f=1;char s=getchar();
  6. for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
  7. for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
  8. return x*f;
  9. }
  10. int n,id[N],mmp,val[N],pos[N];
  11. struct edge {
  12. int id,val,type;
  13. bool operator < (const edge &b) const {
  14. return val<b.val;
  15. }
  16. }a[N];
  17. struct node {int v,nxt;}e[N<<1];
  18. int head[N],tot;
  19. void add(int u,int v) {
  20. e[++tot].v=v;
  21. e[tot].nxt=head[u];
  22. head[u]=tot;
  23. }
  24. int low[N],dfn[N],stak[N],top,cnt,vis[N],belong[N],scc;
  25. void clear() {
  26. cnt=scc=tot=0;
  27. mmp=n+n;
  28. memset(head,0,sizeof(head));
  29. memset(dfn,0,sizeof(dfn));
  30. memset(id,0,sizeof(id));
  31. }
  32. void tarjan(int u) {
  33. low[u]=dfn[u]=++cnt;
  34. vis[u]=1;
  35. stak[++top]=u;
  36. for(int i=head[u];i;i=e[i].nxt) {
  37. int v=e[i].v;
  38. if(!dfn[v]) {
  39. tarjan(v);
  40. low[u]=min(low[u],low[v]);
  41. } else if(vis[v]) {
  42. low[u]=min(low[u],dfn[v]);
  43. }
  44. }
  45. if(low[u]==dfn[u]) {
  46. ++scc;
  47. while(stak[top]!=u) {
  48. vis[stak[top]]=0;
  49. belong[stak[top]]=scc;
  50. top--;
  51. }
  52. vis[stak[top]]=0;
  53. belong[stak[top]]=scc;
  54. top--;
  55. }
  56. }
  57. namespace seg {
  58. #define ls rt<<1
  59. #define rs rt<<1|1
  60. void build(int l,int r,int rt) {
  61. if(l==r) return id[rt]=pos[((a[l].id-1)^1)+1],void();
  62. int mid=(l+r)>>1;
  63. id[rt]=++mmp;
  64. build(l,mid,ls);
  65. build(mid+1,r,rs);
  66. add(id[rt],id[ls]),add(id[rt],id[rs]);
  67. }
  68. void update(int u,int L,int R,int l,int r,int rt) {
  69. if(L>R) return;
  70. if(L<=l&&r<=R) return add(u,id[rt]);
  71. int mid=(l+r)>>1;
  72. if(L<=mid) update(u,L,R,l,mid,ls);
  73. if(R>mid) update(u,L,R,mid+1,r,rs);
  74. }
  75. }
  76. bool check(int mid) {
  77. clear();
  78. seg::build(1,n+n,1);
  79. for(int i=1;i<=n+n;++i) {
  80. int l=upper_bound(val+1,val+n+n+1,val[i]-mid)-val;
  81. int r=lower_bound(val+1,val+n+n+1,val[i]+mid)-val-1;
  82. seg::update(i,max(l,1),i-1,1,n+n,1);
  83. seg::update(i,i+1,min(r,2*n),1,n+n,1);
  84. // printf("%d -> [%d,%d]\n",i,l,i-1);
  85. // printf("%d -> [%d,%d]\n",i,i+1,r);
  86. }
  87. for(int i=1;i<=2*n;++i)
  88. if(!dfn[i])
  89. tarjan(i);
  90. for(int i=1;i<=2*n;i+=2)
  91. if(belong[pos[i]]==belong[pos[i+1]]) return 0;
  92. return 1;
  93. }
  94. int main() {
  95. n=read();
  96. for(int i=1;i<=n;++i) {
  97. a[2*i-1].id=2*i-1,a[2*i-1].val=read();
  98. a[2*i].id=2*i,a[2*i].val=read();
  99. }
  100. sort(a+1,a+1+n+n);
  101. for(int i=1;i<=n+n;++i) pos[a[i].id]=i,val[i]=a[i].val;
  102. int l=0,r=1e9,ans=0;
  103. while(l<=r) {
  104. int mid=(l+r)>>1;
  105. if(check(mid)) l=mid+1,ans=mid;
  106. else r=mid-1;
  107. }
  108. printf("%d\n",ans);
  109. return 0;
  110. }

AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图的更多相关文章

  1. AtCoder Regular Contest 069 F - Flags

    题意: 有n个点需要摆在一个数轴上,每个点需要摆在ai这个位置或者bi上,问怎么摆能使数轴上相邻两个点之间的距离的最小值最大. 二分答案后显然是个2-sat判定问题,因为边很多而连边的又是一个区间,所 ...

  2. AtCoder Regular Contest 063 F : Snuke’s Coloring 2 (线段树 + 单调栈)

    题意 小 \(\mathrm{C}\) 很喜欢二维染色问题,这天他拿来了一个 \(w × h\) 的二维平面 , 初始时均为白色 . 然后他在上面设置了 \(n\) 个关键点 \((X_i , Y_i ...

  3. AtCoder Regular Contest 069

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

  4. AtCoder Regular Contest 076 F - Exhausted?

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

  5. AtCoder Regular Contest 082 F

    Problem Statement We have a sandglass consisting of two bulbs, bulb A and bulb B. These bulbs contai ...

  6. AtCoder Regular Contest 074 F - Lotus Leaves

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

  7. AtCoder Regular Contest 081 F - Flip and Rectangles

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

  8. AtCoder Regular Contest 069 D

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

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

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

随机推荐

  1. LinkedList、ArrayList、Vector三者的关系与区别?

    LinkedList.ArrayList.Vector三者的关系与区别? 区分ArrayList,Vector,LinkedList的区别 ArrayList,Vector的区别: 1.出现版本:Ar ...

  2. win10企业版|激|活|码

    使用下面的激活码升级成企业版 NPPR9-FWDCX-D2C8J-H872K-2YT43 激活后,如果右下角出现未激活的白色字体用cmd命令,管理员窗口运行下面的命令 win10企业版用户请依次输入: ...

  3. 2019 找钢网java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.找钢网等公司offer,岗位是Java后端开发,因为发展原因最终选择去了找钢网,入职一年时间了,也成为了面试官 ...

  4. 【Java】调用摄像头进行拍照并保存【详细】以及处理no jniopencv_core in java.library.path的一种方法

    [之前困扰笔者的问题描述]   date:2019.12.18 网上教程很多,但是没有看见完整的,所以写一个出来. 调用摄像头需要javaCV的jar包和openCV的jar包,现在已经不需要安装包了 ...

  5. .NET CORE 动态加载 DLL 的问题

    有个系统, 需要适应不同类型的数据库(同时只使用其中一种),如果把数据库操作层提取出来,然后针对不同的数据库使用不同的 DLL, 再根据不同的项目使用不同的库, 在以前的 ASP.NET 中, 直接把 ...

  6. Python人工智能常用库Numpy使用入门

    第一章 jupyter notebook简单教程 命令模式按键esc开启 Enter : 转入编辑模式 Shift-Enter : 运行本单元,选中下个单元 Ctrl-Enter : 运行本单元 Al ...

  7. 07-组件通信、slot插槽

    一.组件通信 ① 父 => 子 -- 步骤 1)子组件中通过 props 键接受父组件传值 2)父组件通过 v-bind 向子组件传值 --例子 <!DOCTYPE html> &l ...

  8. 干货分享 | 3个开发IoT项目的开源物联网平台

    物联网(IoT)是帮助人工智能(AI)以更好的方式控制和理解事物的未来技术. 艾艺收集了一些最有名的物联网平台,帮助您以受控方式开发物联网项目.物联网平台是帮助设置和管理互联网连接设备的组件套件. 一 ...

  9. Log4j配置详述

    /** * log4j基础配置步骤阐述: * 1.引入log4j相关的jar包文件. * 2.创建log4j的配置文件.      * 3.测试配置是否成功. */ Log4j 根配置语法 下面引入一 ...

  10. 【干货】gitlab-11.10.4版本汉化

    目录 1.YUM安装gitlab-11.10.4 2.gitlab汉化技能 1.YUM安装gitlab-11.10.4 下载gitlab-ce的repo [root@localhost ~]# cur ...