这是一道裸的2-Sat,只要考虑矛盾条件的判断就好了。

矛盾判断:

对于婚礼现场 x 和 y,x 的第一段可以和 y 的第一段或者第二段矛盾,同理,x 的第二段可以和 y 的第一段或者第二段矛盾,条件是 x 的 1或2 段与 y 的 1或2 段有重合,那么选了 x 某一段就不能选择其矛盾的那一段,那就只能选择 y 中的另一段,建立一条 x (u)-> y ( v的对立 ),同理,x (u的对立)<- y ( v ) 。

真的,2-sat千万不要用邻接链表!!!卡死卡死卡死!!!稠密图!!!不要用!!!

我WA和RE和MLE都怪邻接矩阵!!!!!!!!!!!!!!!!!!!!!!!!!

总代码:

下面第一个代码纪念邻接矩阵这个垃圾的Failure!

 #include <cstdio>
#include <stack>
#include <queue>
#include <cstring> const int N = + ; std :: stack < int > s ;
std :: queue < int > q ; struct ConfirmedHY {
int st ;
int en ;
}
dot [ N ] ; int head [ N ] , nxt [ N ] , to [ N ] , cn ;
int headx [ N ] , nxtx [ N ] , tox [ N ] , cnn ;
int dfn [ N ] , low [ N ] , belong [ N ] , cnt , cnx ;
int ind [ N ] , op [ N ] , color [ N ] ;
int sth , stm , enh , enm , len , n ;
bool ins [ N ] ; int minx ( int a , int b ) {
return a > b ? b : a ;
} void create ( int u , int v ) {
cn ++ ;
to [ cn ] = v ;
nxt [ cn ] = head [ u ] ;
head [ u ] = cn ;
} void create_x ( int u , int v ) {
cnn ++ ;
tox [ cnn ] = v ;
nxtx [ cnn ] = headx [ u ] ;
headx [ u ] = cnn ;
} bool conflict ( int id1 , int id2 ) {
int st1 = dot [ id1 ] . st , en1 = dot [ id1 ] . en ;
int st2 = dot [ id2 ] . st , en2 = dot [ id2 ] . en ;
if ( st1 >= en2 || st2 >= en1 )
return false ;
return true ;
} void rebuild ( ) { for ( int i = ; i <= * n ; i ++ ) {
int tmp1 = belong [ i ] ;
for ( int j = head [ i ] ; j ; j = nxt [ j ] ) {
int tmp2 = belong [ to [ j ] ] ;
if ( tmp1 != tmp2 ) {
create_x ( tmp2 , tmp1 ) ;
ind [ tmp1 ] ++ ;
}
}
} } void opp ( ) {
for ( int i = ; i <= n ; i ++ ) {
op [ belong [ i ] ] = belong [ i + n ] ;
op [ belong [ i + n ] ] = belong [ i ] ;
}
} bool judge () {
for ( int i = ; i <= n ; i ++ )
if ( belong [ i ] == belong [ i + n ] )
return true ;
return false ;
} void topsort ( ) {
for ( int i = ; i <= cnx ; i ++ )
if ( ind [ i ] == )
q . push ( i ) ;
while ( ! q . empty ( ) ) {
int tmp = q . front ( ) ;
q . pop ( ) ;
if ( color [ tmp ] == )
color [ tmp ] = , color [ op [ tmp ] ] = ;
//if ( color [ tmp ] == 2 ) continue ;
for ( int i = headx [ tmp ] ; i ; i = nxtx [ i ] ) {
ind [ tox [ i ] ] -- ;
if ( ! ind [ tox [ i ] ] )
q . push ( tox [ i ] ) ;
}
}
} void tarjan ( int x ) {
cnt ++ ;
dfn [ x ] = low [ x ] = cnt ;
ins [ x ] = true ; s . push ( x ) ;
for ( int i = head [ x ] ; i ; i = nxt [ i ] ) {
int v = to [ i ] ;
if ( ! dfn [ v ] ) {
tarjan ( v ) ;
low [ x ] = minx ( low [ x ] , low [ v ] ) ;
}
else if ( ins [ v ] ) low [ x ] = minx ( low [ x ] , dfn [ v ] ) ;
}
if ( dfn [ x ] == low [ x ] ) {
cnx ++ ;
while ( ) {
int tmp = s . top ( ) ;
s . pop ( ) ;
ins [ tmp ] = false ;
belong [ tmp ] = cnx ;
if ( x == tmp ) break ;
}
}
} int main ( ) { while ( scanf ( "%d" , & n ) == ) { cnx = ; cnt = ; cn = ; cnn = ;
memset ( head , , sizeof ( head ) ) ;
memset ( nxt , , sizeof ( nxt ) ) ;
memset ( to , , sizeof ( to ) ) ;
memset ( headx , , sizeof ( headx ) ) ;
memset ( nxtx , , sizeof ( nxtx ) ) ;
memset ( tox , , sizeof ( tox ) ) ;
memset ( belong , , sizeof ( belong ) ) ;
memset ( dfn , , sizeof ( dfn ) ) ;
memset ( ins , false , sizeof ( ins ) ) ;
memset ( low , , sizeof ( low ) ) ;
memset ( dot , , sizeof ( dot ) ) ;
memset ( ind , , sizeof ( ind ) ) ;
memset ( op , , sizeof ( op ) ) ;
memset ( color , , sizeof ( color ) ) ; for ( int i = ; i <= n ; i ++ ) {
scanf ( "%d:%d %d:%d %d" , & sth , & stm , & enh , & enm , & len ) ;
dot [ i ] . st = sth * + stm ;
dot [ i ] . en = sth * + stm + len ;
dot [ i + n ] . st = enh * + enm - len ;
dot [ i + n ] . en = enh * + enm ;
} for ( int i = ; i <= n ; i ++ )
for ( int j = ; j <= n ; j ++ )
if ( i != j ) {
if ( conflict ( i , j ) ) {
create ( i , j + n ) ;
create ( j , i + n ) ;
}
if ( conflict ( i , j + n ) ) {
create ( i , j ) ;
create ( j + n , i + n ) ;
}
if ( conflict ( i + n , j ) ) {
create ( i + n , j + n ) ;
create ( j , i ) ;
}
if ( conflict ( i + n , j + n ) ) {
create ( i + n , j ) ;
create ( j + n , i ) ;
}
} for ( int i = ; i <= * n ; i ++ )
if ( ! dfn [ i ] )
tarjan ( i ) ; if ( judge ( ) ) {
printf ( "NO\n" ) ;
continue ;
}
else printf ( "YES\n" ) ; rebuild ( ) ; opp ( ) ; topsort ( ) ; for ( int i = ; i <= n ; i ++ )
if ( color [ belong [ i ] ] == )
printf ( "%.2d:%.2d %.2d:%.2d\n" , dot [ i ] . st / , dot [ i ] . st % , dot [ i ] . en / , dot [ i ] . en % ) ;
else
printf ( "%.2d:%.2d %.2d:%.2d\n" , dot [ i + n ] . st / , dot [ i + n ] . st % , dot [ i + n ] . en / , dot [ i + n ] . en % ) ;
} return ;
}

玄学MLE

下面是AC代码

 #include <cstdio>
#include <stack>
#include <queue>
#include <cstring> const int N = + ; std :: stack < int > s ;
std :: queue < int > q ;
std :: vector < int > g [ N ] , rg [ N ] ; struct ConfirmedHY {
int st ;
int en ;
}
dot [ N ] ; int dfn [ N ] , low [ N ] , belong [ N ] , cnt , cnx ;
int ind [ N ] , op [ N ] , color [ N ] ;
int sth , stm , enh , enm , len , n ;
bool ins [ N ] ; int minx ( int a , int b ) {
return a > b ? b : a ;
} void create ( int u , int v ) {
g [ u ] . push_back ( v ) ;
} void create_x ( int u , int v ) {
rg [ u ] . push_back ( v ) ;
} bool conflict ( int id1 , int id2 ) {
int st1 = dot [ id1 ] . st , en1 = dot [ id1 ] . en ;
int st2 = dot [ id2 ] . st , en2 = dot [ id2 ] . en ;
if ( st1 >= en2 || st2 >= en1 )
return false ;
return true ;
} void rebuild ( ) { for ( int i = ; i <= * n ; i ++ ) {
int tmp1 = belong [ i ] ;
for ( int j = ; j < g [ i ] . size ( ) ; j ++ ) {
int tmp2 = belong [ g [ i ] [ j ] ] ;
if ( tmp1 != tmp2 ) {
create_x ( tmp2 , tmp1 ) ;
ind [ tmp1 ] ++ ;
}
}
} } void opp ( ) {
for ( int i = ; i <= n ; i ++ ) {
op [ belong [ i ] ] = belong [ i + n ] ;
op [ belong [ i + n ] ] = belong [ i ] ;
}
} bool judge () {
for ( int i = ; i <= n ; i ++ )
if ( belong [ i ] == belong [ i + n ] )
return true ;
return false ;
} void topsort ( ) {
for ( int i = ; i <= cnx ; i ++ )
if ( ind [ i ] == )
q . push ( i ) ;
while ( ! q . empty ( ) ) {
int tmp = q . front ( ) ;
q . pop ( ) ;
if ( color [ tmp ] == )
color [ tmp ] = , color [ op [ tmp ] ] = ;
//if ( color [ tmp ] == 2 ) continue ;
for ( int i = ; i < rg [ tmp ] . size ( ) ; i ++ ) {
int v = rg [ tmp ] [ i ] ;
ind [ v ] -- ;
if ( ! ind [ v ] )
q . push ( v ) ;
}
}
} void tarjan ( int x ) {
cnt ++ ;
dfn [ x ] = low [ x ] = cnt ;
ins [ x ] = true ; s . push ( x ) ;
for ( int i = ; i < g [ x ] . size ( ) ; i ++ ) {
int v = g [ x ] [ i ] ;
if ( ! dfn [ v ] ) {
tarjan ( v ) ;
low [ x ] = minx ( low [ x ] , low [ v ] ) ;
}
else if ( ins [ v ] ) low [ x ] = minx ( low [ x ] , dfn [ v ] ) ;
}
if ( dfn [ x ] == low [ x ] ) {
cnx ++ ;
while ( ) {
int tmp = s . top ( ) ;
s . pop ( ) ;
ins [ tmp ] = false ;
belong [ tmp ] = cnx ;
if ( x == tmp ) break ;
}
}
} int main ( ) { while ( scanf ( "%d" , & n ) == ) { cnx = ; cnt = ;
memset ( belong , , sizeof ( belong ) ) ;
memset ( dfn , , sizeof ( dfn ) ) ;
memset ( ins , false , sizeof ( ins ) ) ;
memset ( low , , sizeof ( low ) ) ;
memset ( dot , , sizeof ( dot ) ) ;
memset ( ind , , sizeof ( ind ) ) ;
memset ( op , , sizeof ( op ) ) ;
memset ( color , , sizeof ( color ) ) ; for ( int i = ; i <= n ; i ++ ) {
scanf ( "%d:%d %d:%d %d" , & sth , & stm , & enh , & enm , & len ) ;
dot [ i ] . st = sth * + stm ;
dot [ i ] . en = sth * + stm + len ;
dot [ i + n ] . st = enh * + enm - len ;
dot [ i + n ] . en = enh * + enm ;
} for ( int i = ; i <= n ; i ++ )
for ( int j = ; j <= n ; j ++ )
if ( i != j ) {
if ( conflict ( i , j ) ) {
create ( i , j + n ) ;
create ( j , i + n ) ;
}
if ( conflict ( i , j + n ) ) {
create ( i , j ) ;
create ( j + n , i + n ) ;
}
if ( conflict ( i + n , j ) ) {
create ( i + n , j + n ) ;
create ( j , i ) ;
}
if ( conflict ( i + n , j + n ) ) {
create ( i + n , j ) ;
create ( j + n , i ) ;
}
} for ( int i = ; i <= * n ; i ++ )
if ( ! dfn [ i ] )
tarjan ( i ) ; if ( judge ( ) ) {
printf ( "NO\n" ) ;
continue ;
}
else printf ( "YES\n" ) ; rebuild ( ) ; opp ( ) ; topsort ( ) ; for ( int i = ; i <= n ; i ++ )
if ( color [ belong [ i ] ] == )
printf ( "%.2d:%.2d %.2d:%.2d\n" , dot [ i ] . st / , dot [ i ] . st % , dot [ i ] . en / , dot [ i ] . en % ) ;
else
printf ( "%.2d:%.2d %.2d:%.2d\n" , dot [ i + n ] . st / , dot [ i + n ] . st % , dot [ i + n ] . en / , dot [ i + n ] . en % ) ; for ( int i = ; i <= * n ; i ++ ) {
g [ i ] . clear ( ) ;
rg [ i ] . clear ( ) ;
}
} return ;
}

Vector邻矩AC


 
 

POJ 3683 Priest John's Busiest Day 【2-Sat】的更多相关文章

  1. poj 3683 Priest John's Busiest Day【2-SAT+tarjan+拓扑】

    转换成2-SAT模型,建边是如果时间(i,j)冲突就连边(i,j'),其他同理 tarjan缩点,判可行性 返图拓扑,输出方案 #include<iostream> #include< ...

  2. POJ 3683 Priest John's Busiest Day / OpenJ_Bailian 3788 Priest John's Busiest Day(2-sat问题)

    POJ 3683 Priest John's Busiest Day / OpenJ_Bailian 3788 Priest John's Busiest Day(2-sat问题) Descripti ...

  3. POJ 3683 Priest John's Busiest Day(2-SAT+方案输出)

    Priest John's Busiest Day Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10010   Accep ...

  4. POJ 3683 Priest John's Busiest Day (2-SAT)

    Priest John's Busiest Day Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6900   Accept ...

  5. POJ 3683 Priest John's Busiest Day(2-SAT 并输出解)

    Description John is the only priest in his town. September 1st is the John's busiest day in a year b ...

  6. poj - 3683 - Priest John's Busiest Day(2-SAT)

    题意:有N场婚礼,每场婚礼的开始时间为Si,结束时间为Ti,每场婚礼有个仪式,历时Di,这个仪式要么在Si时刻开始,要么在Ti-Di时刻开始,问能否安排每场婚礼举行仪式的时间,使主持人John能参加所 ...

  7. POJ 3683 Priest John's Busiest Day (2-SAT)

    题意:有n对新人要在同一天结婚.结婚时间为Ti到Di,这里有时长为Si的一个仪式需要神父出席.神父可以在Ti-(Ti+Si)这段时间出席也可以在(Di-Si)-Si这段时间.问神父能否出席所有仪式,如 ...

  8. POJ 3683 Priest John's Busiest Day (2-SAT,常规)

    题意: 一些人要在同一天进行婚礼,但是牧师只有1个,每一对夫妻都有一个时间范围[s , e]可供牧师选择,且起码要m分钟才主持完毕,但是要么就在 s 就开始,要么就主持到刚好 e 结束.因为人数太多了 ...

  9. POJ 3683 Priest John's Busiest Day

    2-SAT简单题,判断一下两个开区间是否相交 #include<cstdio> #include<cstring> #include<cmath> #include ...

随机推荐

  1. svchost.exe占网速的解决办法

    1.win+R,然后输入gpedit.msc打开本地组策略编辑器. 2.打开window设置--安全设置--本地策略--安全选项--找到 用户帐户控制: 以管理员批准模式运行所有管理员 和 用户帐户控 ...

  2. C#3.0新特性:隐式类型、扩展方法、自动实现属性,对象/集合初始值设定、匿名类型、Lambda,Linq,表达式树、可选参数与命名参数

    一.隐式类型var 从 Visual C# 3.0 开始,在方法范围中声明的变量可以具有隐式类型var.隐式类型可以替代任何类型,编译器自动推断类型. 1.var类型的局部变量必须赋予初始值,包括匿名 ...

  3. 使用zepto实现QQ消息左滑删除效果

    有这样一个需求: 1. 有一个列表,将每一个列表项左滑动出现删除按钮: 2. 右滑动隐藏删除按钮: 3. 点击这个删除按钮删除该列表项. 完成以后的效果: 这是微信网页端的页面,使用的是 zepto ...

  4. 【OpenCV】图像增强---灰度变换、直方图均衡化

    图像增强的目的:改善图像的视觉效果或使图像更适合于人或机器的分析处理.通过图像增强,可以减少图像噪声,提高目标与背景的对比度,也可以增强或抑制图像中的某些细节.  ------------------ ...

  5. redis和mecache和ehcache的特点

    最近项目组有用到这三个缓存,去各自的官方看了下,觉得还真的各有千秋!今天特意归纳下各个缓存的优缺点,仅供参考! Ehcache 在java项目广泛的使用.它是一个开源的.设计于提高在数据从RDBMS中 ...

  6. 2018-2019-2 网络对抗技术 20165322 Exp5 MSF基础应用

    2018-2019-2 网络对抗技术 20165322 Exp5 MSF基础应用 目录 实验内容与步骤 一个主动攻击实践 MS08-067(失败) ms17_010_psexec(成功且唯一) 一个针 ...

  7. BZOJ2004:[HNOI2010]Bus 公交线路(状压DP,矩阵乘法)

    Description 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1km. 作为公交车线路的规划者,小Z调查了市民的需求,决定 ...

  8. selenium + python自动化测试unittest框架学习(四)python导入模块及包知识点

    在写脚本的时候,发现导入某些模块,经常报错提示导入模块失败,这里来恶补下python导入模块的知识点. 1.模块导入时文件查找顺序 在脚本中,import xxx模块时的具体步骤: (1)新建一个mo ...

  9. saltstack安装配置(yum)

    主机规划: (主)master:192.168.25.130 (从)minion:192.168.25.131     192.168.25.132 1.yum安装: 服务端:安装master yum ...

  10. xmppframework 简介

    XMPPFramework是一个OS X/iOS平台的开源项目,使用Objective-C实现了XMPP协议(RFC-3920),同时还提供了用于读写XML的工具,大大简化了基于XMPP的通信应用的开 ...