玄二关,求助2-sat题
  • 板块学术版
  • 楼主20090818Cc
  • 当前回复2
  • 已保存回复2
  • 发布时间2025/6/16 19:34
  • 上次更新2025/6/17 10:47:27
查看原帖
玄二关,求助2-sat题
1268457
20090818Cc楼主2025/6/16 19:34

题面

我的代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int M=4e6+110;
inline int read(){
	int sum=0,k=1;char c=getchar();
	while(c>'9'||c<'0'){if(c=='-')k=-1;c=getchar();
	}while(c>='0'&&c<='9'){sum=sum*10+c-48;c=getchar();
	}return sum*k;
}
int Head[M],Tot=0;
struct Node_{
	int Next,To;
}Ed[M];
inline void Adde(int u,int v){
	Ed[++Tot]={Head[u],v};
	Head[u]=Tot;
}
bool Insta[M];
int Top=0,Ti=0,Scc_Cnt=0;
int Dfn[M],Low[M],Id[M],Sta[M];
inline void Tarjan(int u){
	Sta[++Top]=u;
	Insta[u]=true;
	Dfn[u]=Low[u]=++Ti;
	for(int i=Head[u];i;i=Ed[i].Next){
		int v=Ed[i].To;
		if(!Dfn[v]){
			Tarjan(v);
			Low[u]=min(Low[u],Low[v]);
		}
		else if(Insta[v]) Low[u]=min(Low[u],Dfn[v]);
	}
	if(Dfn[u]==Low[u]){
		Scc_Cnt++;
		int v;
		do{
			v=Sta[Top--];
			Insta[v]=false;
			Id[v]=Scc_Cnt;
		}while(u!=v);
	}
}
int n;
int st[M],en[M],d[M];
inline int turn(int cl,int min){
	return cl*60+min;
}
int res[M];
inline void pu(int t){
	int cl=t/60,mi=t%60;
	if(cl<10) cout<<0;
	cout<<cl<<":";
	if(mi<10) cout<<0;
	cout<<mi;
}
signed main(){
	n=read();
	for(int i=1;i<=n;i++){
		int stc=read(),stm=read(),enc=read(),enm=read(),di=read();
		st[i]=turn(stc,stm),en[i]=turn(enc,enm),d[i]=di;
//		cout<<st[i]<<" "<<en[i]<<" "<<d[i]<<endl;
		Adde(i,i+n+n*2);
		Adde(i+n,i+n*2);
		Adde(i+n*2,i+n);
		Adde(i+n+n*2,i);
	}
	for(int i=1;i<=n;i++)
		for(int j=i+1;j<=n;j++){
			int s1=st[i],s2=st[j],e1=en[i],e2=en[j],d1=d[i],d2=d[j];
			if(s1<=s2&&s1+d1>s2){
				Adde(i,j+n*2);
				Adde(j,i+n*2);
			}
			if(s2<=s1&&s2+s2>s1){
				Adde(i,j+n*2);
				Adde(j,i+n*2);
			}
			if(e1<=e2&&e1+d1>e2){
				Adde(i+n,j+n+2*n);
				Adde(j+n,i+n+2*n);
			}
			if(e2<=e1&&e2+d2>e1){
				Adde(i+n,j+n+2*n);
				Adde(j+n,i+n+2*n);
			}
		}
	for(int i=1;i<=n*4;i++) if(!Dfn[i]) Tarjan(i);
	for(int i=1;i<=n*2;i++) if(Id[i]==Id[i+n*2]){
		printf("NO\n");
		return 0;
	}else if(Id[i]<Id[i+n*2]) res[i]=true;
	printf("YES\n");
	for(int i=1;i<=n;i++){
		if(res[i]){
			pu(st[i]);
			cout<<" ";
			pu(st[i]+d[i]);
			cout<<endl;
		}
		else{
			pu(en[i]-d[i]);
			cout<<" ";
			pu(en[i]);
			cout<<endl;
		}
	}
	return 0;
}

错的数据

输入:

100
00:00 06:25 9
00:02 00:12 3
00:12 02:59 13
00:14 00:36 11
00:36 03:05 17
00:24 00:55 2
00:07 00:56 1
00:56 17:01 4
01:00 03:55 18
01:18 21:08 36
01:54 11:02 8
02:02 10:23 32
02:34 05:17 29
02:23 03:06 3
03:06 03:20 1
02:15 03:13 6
02:44 03:30 17
03:30 05:05 22
03:52 22:58 5
00:07 04:08 11
04:08 06:56 21
04:10 05:01 32
02:48 05:12 11
05:12 22:10 2
05:14 21:01 19
00:10 05:35 2
04:50 05:44 9
05:44 20:38 7
05:07 05:57 6
02:12 06:13 16
04:55 06:18 5
06:18 08:25 6
06:24 23:44 18
06:42 23:23 4
06:46 13:01 1
06:13 07:08 21
07:08 09:03 9
01:28 07:39 22
02:55 08:00 21
08:00 21:25 3
03:15 08:43 40
04:18 08:59 16
05:28 09:15 16
03:42 09:30 15
09:30 21:09 18
09:48 15:52 27
05:59 10:32 17
10:32 15:49 7
08:41 10:41 2
09:07 10:42 1
10:42 15:51 3
09:44 10:53 8
01:32 11:04 11
11:04 13:48 25
08:12 11:58 29
11:58 14:42 7
00:17 12:15 10
09:00 12:54 39
12:54 22:05 2
12:56 20:36 19
04:30 13:19 4
10:26 13:22 3
13:22 14:39 19
11:37 13:51 10
11:25 14:39 48
02:37 15:05 26
11:24 15:52 47
15:52 23:37 28
16:20 19:36 18
16:38 23:57 1
02:34 17:12 33
17:12 22:41 4
17:16 19:30 1
00:22 17:27 10
12:11 17:41 14
13:32 17:48 7
17:48 20:37 29
01:47 18:27 10
08:48 18:28 1
18:28 19:51 30
18:58 20:39 8
19:06 22:35 16
19:22 21:38 6
19:28 20:15 14
19:42 21:45 17
04:49 20:54 55
20:54 21:39 11
12:31 21:22 17
21:22 22:15 3
10:56 21:48 23
21:48 23:07 2
21:50 23:40 3
12:12 22:05 12
00:32 22:11 6
07:31 22:21 10
15:45 22:26 5
22:26 23:51 68
23:34 23:41 2
23:36 23:52 4
23:40 23:59 16

正确输出:

YES
00:00 00:09
00:09 00:12
00:12 00:25
00:25 00:36
00:36 00:53
00:53 00:55
00:55 00:56
00:56 01:00
01:00 01:18
01:18 01:54
01:54 02:02
02:02 02:34
02:34 03:03
03:03 03:06
03:06 03:07
03:07 03:13
03:13 03:30
03:30 03:52
03:52 03:57
03:57 04:08
04:08 04:29
04:29 05:01
05:01 05:12
05:12 05:14
05:14 05:33
05:33 05:35
05:35 05:44
05:44 05:51
05:51 05:57
05:57 06:13
06:13 06:18
06:18 06:24
06:24 06:42
06:42 06:46
06:46 06:47
06:47 07:08
07:08 07:17
07:17 07:39
07:39 08:00
08:00 08:03
08:03 08:43
08:43 08:59
08:59 09:15
09:15 09:30
09:30 09:48
09:48 10:15
10:15 10:32
10:32 10:39
10:39 10:41
10:41 10:42
10:42 10:45
10:45 10:53
10:53 11:04
11:04 11:29
11:29 11:58
11:58 12:05
12:05 12:15
12:15 12:54
12:54 12:56
12:56 13:15
13:15 13:19
13:19 13:22
13:22 13:41
13:41 13:51
13:51 14:39
14:39 15:05
15:05 15:52
15:52 16:20
16:20 16:38
16:38 16:39
16:39 17:12
17:12 17:16
17:16 17:17
17:17 17:27
17:27 17:41
17:41 17:48
17:48 18:17
18:17 18:27
18:27 18:28
18:28 18:58
18:58 19:06
19:06 19:22
19:22 19:28
19:28 19:42
19:42 19:59
19:59 20:54
20:54 21:05
21:05 21:22
21:22 21:25
21:25 21:48
21:48 21:50
21:50 21:53
21:53 22:05
22:05 22:11
22:11 22:21
22:21 22:26
22:26 23:34
23:34 23:36
23:36 23:40
23:43 23:59

我的输出:

NO

谢谢佬们

2025/6/16 19:34
加载中...