首页 > 其他分享 >D46 2-SAT+线段树优化+二分 [ARC069F] Flags

D46 2-SAT+线段树优化+二分 [ARC069F] Flags

时间:2024-08-18 09:26:35浏览次数:8  
标签:线段 ARC069F Flags include D46 SAT

视频链接:

 

[ARC069F] Flags - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

// D46 2-SAT+线段树优化+二分 O(nlognlogv)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

#define mid ((l+r)>>1)
#define ls (u<<1)
#define rs (u<<1|1)

const int N=20010,M=N*10;
int head[M],ne[N*40],to[N*40],idx;
void add(int x,int y){
  to[++idx]=y;ne[idx]=head[x];head[x]=idx;
}
int dfn[M],low[M],stk[M],scc[M],tim,top,sc;
struct F{
  int pos,id;
  bool operator<(const F& b)const{return pos<b.pos;}
  F(int pos=0):pos(pos){}
}f[N];
int n,tot,id[M];

void build(int u,int l,int r){
  id[u]=++tot; //节点编号
  if(l==r){
    int x=f[l].id;
    add(id[u],x<=n?x+n:x-n); //叶子→反点
    return;
  }
  build(ls,l,mid);
  build(rs,mid+1,r);
  add(id[u],id[ls]);
  add(id[u],id[rs]); //父→子
}
void link(int u,int l,int r,int x,int y,int p){
  if(x>r||y<l) return;
  if(x<=l&&r<=y){
    add(p,id[u]); //p点向区间id[u]连边
    return;
  }
  link(ls,l,mid,x,y,p),
  link(rs,mid+1,r,x,y,p);
}
void tarjan(int x){
  dfn[x]=low[x]=++tim;
  stk[++top]=x;
  for(int i=head[x];i;i=ne[i]){
    int y=to[i];
    if(!dfn[y]){ //若y尚未访问
      tarjan(y);
      low[x]=min(low[x],low[y]);
    }
    else if(!scc[y]) //若y已访问且未处理
      low[x]=min(low[x],dfn[y]);
  }
  if(low[x]==dfn[x]){ //若x是SCC的根
    ++sc;
    for(int y=-1;y!=x;)
      scc[y=stk[top--]]=sc;
  }
}
bool check(int m){
  memset(head,0,sizeof(head));
  memset(dfn,0,sizeof(dfn));
  memset(low,0,sizeof(low));
  memset(scc,0,sizeof(scc));
  idx=tim=top=sc=0;
  
  build(1,1,tot=2*n);
  for(int i=1,x,y;i<=2*n;i++){
    x=upper_bound(f+1,f+1+2*n,F(f[i].pos-m))-f;
    y=upper_bound(f+1,f+1+2*n,F(f[i].pos+m-1))-f-1;
    link(1,1,2*n,x,i-1,f[i].id); //x是距离<m的左下标
    link(1,1,2*n,i+1,y,f[i].id); //y是距离<m的右下标
  }
  
  for(int i=1;i<=2*n;i++) if(!dfn[i]) tarjan(i);
  for(int i=1;i<=n;i++) if(scc[i]==scc[i+n]) return 0;
  return 1;
}
int main(){
  scanf("%d",&n);
  for(int i=1;i<=n;i++){
    scanf("%d%d",&f[i].pos,&f[i+n].pos);
    f[i].id=i,f[i+n].id=i+n; //
  }
  sort(f+1,f+n*2+1); //按pos排序
  int l=0,r=f[2*n].pos-f[1].pos+1,m;
  while(l+1<r){ //二分距离
    m=(l+r)/2;
    check(m)?l=m:r=m;
  }
  printf("%d",l);
}

 

标签:线段,ARC069F,Flags,include,D46,SAT
From: https://www.cnblogs.com/dx123/p/18335192

相关文章

  • [vue3] patchFlags与位运算
    Vue3在编译template的过程中会分析模板中的动态部分和静态部分,并标记相应的flag,用于在运行时优化虚拟DOM的更新。Parse:将模板字符串解析成AST;Transform:对AST进行转换和优化,包括识别动态节点和静态节点;CodeGeneration:将转换后的AST生成渲染函数,这个阶段会生成patchFlags。在d......
  • PgStatement的executeCachedSql(String sql, int flags, String @Nullable [] column
    方法代码如下:privatebooleanexecuteCachedSql(Stringsql,intflags,String@Nullable[]columnNames)throwsSQLException{//第一部分PreferQueryModepreferQueryMode=connection.getPreferQueryMode();booleanshouldUseParameterized=false;......
  • Cobra - Flags are parsed after rootCmd.Execute()
     root.go:funcinit(){rootCmd.PersistentFlags().BoolVarP(&enableLogging,"log","l",true,"Logginginformation")fmt.Println("*************************",enableLogging)}funcExecute(){err:......
  • CommandFlags枚举类
    API地址:https://help.autodesk.com/view/OARX/2018/ENU/?guid=OREFNET-Autodesk_AutoCAD_Runtime_CommandFlags相关博客介绍:https://www.cnblogs.com/liweis/p/4561226.htmlNoHistory:该命令不会添加到AutoCAD的重复上一个命令功能中。UsePickSet:检索拾取第一个集时,它将在A......
  • Unity Camera组件ClearFlags属性介绍以及区分UI摄像机和角色摄像机
    在Unity中,Camera.clearFlags属性用于定义相机在渲染场景之前如何清除屏幕。这个属性有几个不同的选项,每个选项都会以不同的方式清除屏幕。具体选项如下:Skybox:如果相机有分配的天空盒(Skybox),在渲染场景之前将用天空盒来清除屏幕。如果没有分配天空盒,则使用纯色来清除屏幕,颜色......
  • TCP_FLAGS_PROCESSING_09: [close-wait| closing | last-ack] FIN -> ignore
    测试目的:验证TCP在CLOSE-WAIT、CLOSING或LAST-ACK状态下,接收到FIN段时是否能够保持当前状态不变。描述:TCP在CLOSE-WAIT、CLOSING或LAST-ACK状态下,当接收到一个FIN段时,不应改变其状态。这是确保TCP连接能够按照正常的关闭序列进行,避免状态的意外变化。测试拓扑:具体步骤......
  • messageBox->setWindowFlags(Qt::FramelessWindowHint | Qt::Tool);讲解
    当我们调用setWindowFlags方法时,我们在设置窗口的标志。这些标志控制着窗口的外观和行为。在这个例子中,我们使用了Qt::FramelessWindowHint和Qt::Tool两个标志。Qt::FramelessWindowHint:这个标志告诉Qt不要绘制窗口的边框和标题栏。这样可以创建一个没有边框的窗口,通常用......
  • TCP_FLAGS_INVALID_10: [finwait-2] (otw SEQ)-> ACK(seq) [finwait-2]
    测试目的:验证TCP在FINWAIT-2状态下,接收到一个序列号超出窗口(OTW)的段时,是否能够发送一个ACK段,并保持在相同的状态。描述:TCP在FINWAIT-2状态下,如果接收到一个没有RST标志且序列号超出接收窗口的段,它必须发送一个ACK段,其中确认号表示期望的下一个序列号,并保持在FINWAIT-2状......
  • [ARC069F] Flags
    题意有\(n\)个旗子。你需要将她们插在数轴上。第\(i\)个旗子只能放在\(x_i\)或\(y_i\)处。你需要求所有旗子的最小距离\(d\)的最大值。Sol二分个答案先。考虑\(\text{check}\),注意到这是个\(\text{2-sat}\)的经典模型。具体地,设\(S=x\cupy\)若\(|S_i......
  • dbt flags 变量简单说明
    通过flags可以使用dbtcli的一些参数,比较常用的是对于增量物化处理的场景参考使用{%ifflags.FULL_REFRESH%}droptable...{%else%}--no-op{%endif%}说明支持的参数都在flags中可以看看,一些dbtadapter的实现都会使用到此变量参考......