题面

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. 使用curl指令实现restful接口操作

    curl 是很方便的Rest客戶端,可以很方便的完成許多Rest API測試的需求,甚至,如果是需要先登入或認證的rest api,也可以進行測試,利用curl指令,可以送出HTTP GET, POS ...

  2. HTML 5适合小公司,适合在大平台上做内容

    Web App,现在有时候也称为轻应用,不仅是通过浏览器就能打开的应用.现在随着 HTML 5 在手机端的优越性,已经慢慢称为了 Web App 的主流.Web App 除了出现在 PC 的浏览器中, ...

  3. Python之整数类型

    整数:18,73,84 每一个整数都有如下的功能:class int(object): """ int(x=0) -> int or long int(x, bas ...

  4. uva 10739【基础(区间)dp】

    Uva 10739 题意:给定字符串,可以增加.删除.修改任意字符,问最少经过多少次操作使字符串回文. 题解:定义dp[l][r]表示把从l到r的子串Sl...Sr变成回文串需要操作的最少次数.字符可 ...

  5. Java面向对象----继承概念,super关键字

    继承概念: 继承需要符合的关系  is-a  , 父类通用更抽象,子类更特殊更具体 类之间的关系 继承体现 组合体现 实现接口体现 继承的意义 代码重用 体现不同抽象层次 extends关键字 Sup ...

  6. UVa 10520【递推 搜索】

    UVa 10520 哇!简直恶心的递推,生推了半天..感觉题不难,但是恶心,不推出来又难受..一不小心还A了[]~( ̄▽ ̄)~*,AC的猝不及防... 先递推求出f[i][1](1<=i< ...

  7. sql查询报java.sql.SQLException: Column 'LC_ID' not found 的错误实际上是mysql在hibernate别名的问题

    报java.sql.SQLException: Column 'LC_ID' not found 的错误实际上是mysql在hibernate别名的问题 我的查询sql是 String sql2 =& ...

  8. 12 将类处理为excel,再将excel处理为类(界限计划3)

    中间使用map作为中间处理 将类处理为excel: 1.读取类转为map //读取btl,转为map public static Map getBtlMap(String rule, BTLDAO b ...

  9. 「BZOJ2654」tree

    「BZOJ2654」tree 最小生成树+二分答案. 最开始并没有觉得可以二分答案,因为答案并不单调啊. 其实根据题意,白边的数目肯定大于need条,而最小生成树的白边数并不等于need(废话),可以 ...

  10. 在ThinkPHP中,if标签和比较标签对于变量的比较。

    在TP模板语言中.if和eq都可以用于变量的比较. <比较标签 name="变量" value="值">内容</比较标签> 比如: &l ...