题面

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)的更多相关文章

  1. 图论(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 ...

  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. 【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 ...

  4. poj 3686 Priest John's Busiest Day

    http://poj.org/problem?id=3683 2-sat 问题判定,输出一组可行解 http://www.cnblogs.com/TheRoadToTheGold/p/8436948. ...

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

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

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

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

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

    原题如下: Priest John's Busiest Day Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 12162   ...

  8. 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 ...

  9. POJ3683 Priest John's Busiest Day(2-SAT)

    Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 11049   Accepted: 3767   Special Judge ...

  10. 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 ...

随机推荐

  1. [转]GDB调试基础

    一.gdb常用命令: 命令 描述 backtrace(或bt) 查看各级函数调用及参数 finish 连续运行到当前函数返回为止,然后停下来等待命令 frame(或f) 帧编号 选择栈帧 info(或 ...

  2. centos6.5后台进程的切换

    1.运行.sh文件 直接用./sh 文件就可以运行,但是如果想后台运行,即使关闭当前的终端也可以运行的话,需要nohup命令和&命令. (1)&命令 功能:加在一个命令的最后,可以把这 ...

  3. springboot 启动配置原理【转】【补】

    创建应用 几个重要的事件回调机制  , 配置在META-INF/spring.factories ApplicationContextInitializer SpringApplicationRunL ...

  4. android 重写系统进度条

    转载自http://blog.csdn.net/codingandroid/article/details/8495074 自定义progressbar现在要自定义一个等待的时候转动的小圈,相信大家也 ...

  5. nodeJs学习-13 router

    const express=require('express'); var server=express(); //目录1:/user/ var routeUser=express.Router(); ...

  6. 项目上使用的每月1日自动导出Zabbix性能数据的python脚本

    基于zabbix-manager python2.7 #!/usr/bin/env python # -*- coding: utf-8 -*- # __author__ = "life&q ...

  7. hdu1730 尼姆博弈

    抽象一下把距离当做石子个数.虽然在这里石子个数可以增加,但是不管怎么增加,不会影响结果,因为你增加了,必须会有减少的. 所以类似取石子,观察平衡状态,如果(x2-x1-1)^...==0,必输. wa ...

  8. 洛谷2375 BZOJ 3670动物园题解

    题目链接 洛谷链接 我们发现题目要我们求的num[i]东西本质上其实是 求有多少以i结尾的非前缀且能与前缀匹配的字符串,而且要求字符串长度小于(i/2) 我们先不考虑字符串长度的限制,看所有以i结尾的 ...

  9. 【NS2】Ubuntu 12.04 LTS 中文输入法的安装(转载)

    本文是笔者使用 Ubuntu 操作系统写的第一篇文章!参考了红黑联盟的这篇文章:Ubuntu 12.04中文输入法的安装 安装 Ubuntu 12.04 着实费力一番功夫,老是在用 Ubuntu 来引 ...

  10. Python里的迭代器

    迭代器(iterator)协议 · 在Python中,支持迭代器协议就是实现对象的__iter__()和__next__()方法. 1.__iter__()方法:返回迭代器对象本身: 2.__next ...