Priest John's Busiest Day (2-sat)
题面
John is the only priest in his town. September 1st is the John's busiest day in a year because there is an old legend in the town that the couple who get married on that day will be forever blessed by the God of Love. This year N couples plan to get married on the blessed day. The i-th couple plan to hold their wedding from time Si to time Ti. According to the traditions in the town, there must be a special ceremony on which the couple stand before the priest and accept blessings. The i-th couple need Di minutes to finish this ceremony. Moreover, this ceremony must be either at the beginning or the ending of the wedding (i.e. it must be either from Si to Si + Di, or from Ti - Di to Ti). Could you tell John how to arrange his schedule so that he can present at every special ceremonies of the weddings.
题意
挑战P326
思路
记\(x_i\)为第\(i\)对新人在开始时举行仪式
记\(\overline{x_i}\)为第\(i\)对新人在结束时举行仪式
如果\(x_i\)与\(x_j\)冲突,那么\(x_i\)与\(x_j\)不能同时取到,所以连边\(x_i\)->\(\overline{x_j}\),\(x_j\)->\(\overline{x_i}\)
其他三种情况同理
注意,结束时间可以和另外一个开始时间相同
#include<iostream>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
#define fuck(x) cerr<<#x<<" = "<<x<<endl;
#define debug(a, x) cerr<<#a<<"["<<x<<"] = "<<a[x]<<endl;
#define lson l,mid,ls
#define rson mid+1,r,rs
#define ls (rt<<1)
#define rs ((rt<<1)|1)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int loveisblue = 486;
const int maxn = 1000086;
const int maxm = 2000086;
const int inf = 0x3f3f3f3f;
const ll Inf = 999999999999999999;
const int mod = 1000000007;
const double eps = 1e-6;
const double pi = acos(-1);
int n;
int point1(int x){
return x;
}
int point2(int x){
return x+n;
}
char s[10];
struct node{
int st,ed,d;
}a[maxn];
int cal(){
int tmp1 = (s[0]-48)*10 + s[1]-48;
int tmp2 = (s[3]-48)*10 + s[4]-48;
return tmp1*60 + tmp2;
}
int check(int st1,int st2,int d1,int d2){
int ed1 = st1+d1;
int ed2 = st2+d2;
if(ed1>st2&&ed1<=ed2){
return true;
}else return ed2 > st1 && ed2 <= ed1;
}
int Head[maxn],cnt;
struct edge{
int Next,v;
}e[maxm],et[maxm];
void add_edge(int u,int v){
// cerr<<u<<" "<<v<<endl;
e[cnt].Next=Head[u];
e[cnt].v=v;
Head[u]=cnt++;
}
int Headt[maxn],cntt;
void add_edget(int u,int v){
// cerr<<u<<" "<<v<<endl;
et[cntt].Next=Headt[u];
et[cntt].v=v;
Headt[u]=cntt++;
}
int dfn[maxn],low[maxn],color[maxn];
int Index,sig;//只有这两个变量和dfn需要初始化
bool vis[maxn];
stack<int>sta;
void Tarjan(int u)
{
dfn[u]=low[u]=++Index;
sta.push(u);
vis[u]=true;
for(int k=Head[u];k!=-1;k=e[k].Next){
int v = e[k].v;
if(!dfn[v]){
Tarjan(v);
low[u]=min(low[u],low[v]);
}else if(vis[v]){low[u]=min(low[u],low[v]);}
}
if(dfn[u]==low[u]){
sig++;
while(true){
int cur=sta.top();
sta.pop();
color[cur]=sig;
vis[cur]=false;
if(cur==u){break;}
}
}
}
queue<int>q;
int du[maxn];
int num[maxn];
void top_sort(){
int cur = 0;
while (!q.empty()){
int tmp = q.front();
// fuck(tmp)
q.pop();
num[tmp]=++cur;
for(int k=Headt[tmp];~k;k=et[k].Next){
// fuck(k)
du[et[k].v]--;
if(du[et[k].v]==0){
q.push(et[k].v);
}
}
}
}
int main() {
ios::sync_with_stdio(true);
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif
memset(Head,-1,sizeof(Head));
memset(Headt,-1,sizeof(Headt));
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%s",s);
a[i].st = cal();
scanf("%s",s);
a[i].ed = cal();
scanf("%d",&a[i].d);
for(int j=1;j<i;j++){
//开始与开始相冲突
if(check(a[i].st,a[j].st,a[i].d,a[j].d)){
add_edge(point1(i),point2(j));
add_edge(point1(j),point2(i));
}if(check(a[i].st,a[j].ed-a[j].d,a[i].d,a[j].d)){
add_edge(point1(i),point1(j));
add_edge(point2(j),point2(i));
}if(check(a[i].ed-a[i].d,a[j].st,a[i].d,a[j].d)){
add_edge(point1(j),point1(i));
add_edge(point2(i),point2(j));
}if(check(a[i].ed-a[i].d,a[j].ed-a[j].d,a[i].d,a[j].d)){
add_edge(point2(i),point1(j));
add_edge(point2(j),point1(i));
}
}
}
for(int i=1;i<=n*2;i++){
if(!dfn[i])Tarjan(i);
}
bool flag=true;
for(int i=1;i<=n;i++){
if(color[point1(i)]==color[point2(i)]){
flag=false;
}
}
if(flag){
printf("YES\n");
for(int i=1;i<=2*n;i++){
for(int k=Head[i];~k;k=e[k].Next){
if(color[i]!=color[e[k].v]){
add_edget(color[i],color[e[k].v]);
du[color[e[k].v]]++;
}
}
}
for(int i=1;i<=sig;i++){
if(du[i]==0){
q.push(i);
}
}
top_sort();
for(int i=1;i<=n;i++){
if(num[color[point1(i)]]>num[color[point2(i)]]){
printf("%02d:%02d ",a[i].st/60,a[i].st%60);
a[i].st+=a[i].d;
printf("%02d:%02d\n",a[i].st/60,a[i].st%60);
}else{
a[i].ed-=a[i].d;
printf("%02d:%02d ",a[i].ed/60,a[i].ed%60);
a[i].ed+=a[i].d;
printf("%02d:%02d\n",a[i].ed/60,a[i].ed%60);
}
}
}else{
printf("NO\n");
}
return 0;
}
Priest John's Busiest Day (2-sat)的更多相关文章
- 图论(2-sat):Priest John's Busiest Day
Priest John's Busiest Day Description John is the only priest in his town. September 1st is the Jo ...
- 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 ...
- 【POJ3683】Priest John's Busiest Day
题目 John is the only priest in his town. September 1st is the John's busiest day in a year because th ...
- poj 3686 Priest John's Busiest Day
http://poj.org/problem?id=3683 2-sat 问题判定,输出一组可行解 http://www.cnblogs.com/TheRoadToTheGold/p/8436948. ...
- POJ 3683 Priest John's Busiest Day (2-SAT)
Priest John's Busiest Day Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6900 Accept ...
- POJ 3683 Priest John's Busiest Day(2-SAT+方案输出)
Priest John's Busiest Day Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10010 Accep ...
- Priest John's Busiest Day(POJ 3683)
原题如下: Priest John's Busiest Day Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 12162 ...
- 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 ...
- POJ3683 Priest John's Busiest Day(2-SAT)
Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 11049 Accepted: 3767 Special Judge ...
- HDU 2491 Priest John's Busiest Day(贪心)(2008 Asia Regional Beijing)
Description John is the only priest in his town. October 26th is the John's busiest day in a year be ...
随机推荐
- oracle 数据库安全审计
Oracle的审计机制是用来监视用户对ORACLE数据库所做的各种操作. 在缺省情况下,系统的审计功能是关闭的.可以在INIT.ORA参数文件中将参数AUDIT_TRAIL设置为正整数来激活. 审计功 ...
- Python2.7下,调用subprocess启动子进程,读取子进程标准输出若干问题
1:如果调用的子进程也是一个python脚本,则subprocess.Popen中的bufsize=1无效果.也就是说,即使设置了bufsize=1表示进行行缓冲,子进程如果不显示调用sys.stdo ...
- element-ui select 二级联动
在使用select 选择框时,2个select 怎么关联在一起(第一个值发生变化,第二个select值随第一个变化而不同) 两个输入框代码 <el-form :inline="tru ...
- Java8 日期、时间操作
一.简介 在Java8之前,日期时间API一直被开发者诟病,包括:java.util.Date是可变类型,SimpleDateFormat非线程安全等问题.故此,Java8引入了一套全新的日期时间处理 ...
- KiCad EDA 镜像目录说明
KiCad EDA 镜像目录说明 stable/ -- 稳定版安装包. testing/ -- 测试安装包. nightly/ -- 每日编译安装包. 5.1 版本的每日编译包,这个文件夹是重点,如果 ...
- 利用backtrace和ucontex定位segment错误
C程序运行时,经常会碰到"segmentfault"错误.这是由于程序中非法访问内存导致的.当操作系统的内存保护机制发现进程访问了非法内存的时候会向此进程发送一个SIGSEGV信号 ...
- inflate用一个XML源填充view. LayoutInflater
java.lang.Object android.view.LayoutInflater This class is used to instantiate layout XML file i ...
- Flask_Migrate数据库迁移
migrate数据库迁移 有models,没有迁移仓库.本地新建数据库:首次创建迁移仓库.迁移脚本:执行迁移脚本生成数据库表: python manage.py db init python mana ...
- Android7.0 添加快速设定Quick Settings Tile
Android7.0新推出了一个非常实用的功能--添加快速设定(或者翻译成快速设置),但是感觉社区里关注的人比较少,可能目前为止国内还没有Android7.0的手机,但是越早接触越好,甚至可以告诉产品 ...
- Nova中的Hook机制
Nova的代码中支持Hook机制,也就是在某些函数的前后,可以加入自己的代码逻辑.Hook代码可以完全独立于Nova开发,本质上使用setuptools的entry points机制.K版本的Open ...