提出 #60130355


ソースコード 拡げる

#include <bits/stdc++.h>
using namespace std;

#define pb push_back
#define mp make_pair
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef double DOUBLE;
typedef complex<double> point;
#define xx real()
#define yy imag()

#define REP(i, a, b) for(int i = (a); i < (int)(b); i++)
#define REPN(i, a, b) for(int i = (a); i <= (int)(b); i++)
#define FA(it, x) for(__typeof((x).begin()) it = (x).begin(); it != (x).end(); it++)
#define SZ(x) (int)(x).size()
#define BE(x) (x).begin(), (x).end()
#define SORT(x) sort(BE(x))
#define _1 first
#define _2 second

#define x0 gray_cat_x0
#define y0 gray_cat_y0
#define x1 gray_cat_x1
#define y1 gray_cat_y1
#define j0 gray_cat_j0

template<class T> T gcd(T a, T b) { return b ? gcd(b, a % b) : a; }

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

#define file "I1"

const double EPS = 1e-9;
const double PI = acos(-1.);
const ll LL_INF = 1e17 + 16;
const int INF = 1e9 + 10;
// const ll MOD = 1e9 + 7;
const ll MOD = 998244353;

// Graph solving 2-SAT problem
// Works in O(n + m)

// Use:
// 1) Fill gg.n as number of variables (not number of vertices!!!! 
//    Number of vertices will be gg.n * 2)
// 2) Call gg.add_clause(a, val_a, b, val_b) for each clause.
//    For example, for clause !v[i] | v[j] call gg.add_clause(i, 0, j, 1)
// 3) Call gg.build()

// If gg.IsSatisfiable is false there is no solution
// Otherwise answer will be in boolean array gg.result

// Note number of vertices will be twice more than number of variables
const int MAXN = 1e6 + 5;

struct graph{
	// Number of variables (number of vertices will be 2 * n)
	int n;
	
	// Graph
	vi g[MAXN];
	
	// Reverse graph
	vi gr[MAXN];
	
	// For dfs
	char used[MAXN];
	
	// For topological sorting
	vector<int> sorted;
	
	// Indices of condensation components for vertices
	int col[MAXN];
	
	// Current condensation component index
	int cur_col;
	
	// If has solution
	bool IsSatisfiable;
	
	bool result[MAXN];
	
	void clear(){
		for(int i = 0; i < 2 * n; i++){
			g[i].clear();
			gr[i].clear();
		}
		n = 0;
	}
	
	// Add edge (process clause (a | b) where val_a indicates whether we use a or !a)
	void add_clause(int a, int val_a, int b, int val_b){
		g[(a << 1) ^ val_a ^ 1].pb((b << 1) ^ val_b);
		gr[(b << 1) ^ val_b].pb((a << 1) ^ val_a ^ 1);
		
		g[(b << 1) ^ val_b ^ 1].pb((a << 1) ^ val_a);
		gr[(a << 1) ^ val_a].pb((b << 1) ^ val_b ^ 1);
	}
	
	// Dfs with top sorting
	void dfs(int s){
		used[s] = 1;
		for(int i = 0; i < (int)g[s].size(); i++){
			int to = g[s][i];
			if (!used[to]){
				dfs(to);
			}
		}
		sorted.push_back(s);
	}
	
	// DFS in reverse graph
	void dfs_r(int s){
		used[s] = 1;
		col[s] = cur_col;
		for(int i = 0; i < (int)gr[s].size(); i++){
			int to = gr[s][i];
			if (!used[to]){
				dfs_r(to);
			}
		}
	}
	
	// Building condensation
	void get_condensation(){
		// Init
		for(int i = 0; i < 2 * n; i++){
			used[i] = 0;
		}
		sorted.clear();
	
		// First DFS series
		for(int i = 0; i < 2 * n; i++){
			if (!used[i]){
				dfs(i);
			}
		}
		
		// Init
		for(int i = 0; i < 2 * n; i++){
			used[i] = 0;
		}
		cur_col = 0;
		
		// Second DFS series
		for(int i = 2 * n - 1; i >= 0; i--){
			int s = sorted[i];
			if (!used[s]){
				cur_col++;
				dfs_r(s);
			}
		}
	}
	
	void build(){
		// Get condensation
		get_condensation();
		
		// Find satisfability
		IsSatisfiable = true;
		for(int i = 0; i < 2 * n; i += 2){
			if (col[i] == col[i ^ 1]){
				IsSatisfiable = false;
				break;
			}
			if (col[i] > col[i ^ 1]){
				result[i / 2] = false;
			} else {
				result[i / 2] = true;
			}
		}	
	}
};

graph gg;

char ans[MAXN];

void solve(){
	int n, m, a, b, c;
	scanf("%d%d", &n, &m);
	// TODO: set gg.n
	gg.n = 2 * n;
	REP(i, 0, m) {
		scanf("%d%d%d", &a, &b, &c);
		a--, b--;
		if (c == 0) {
			//gg.add_clause(2 * a, 1, 2 * b + 1, 1);
			//gg.add_clause(2 * a, 0, 2 * b + 1, 0);
			gg.add_clause(2 * a, 0, 2 * b + 1, 1);
			gg.add_clause(2 * a, 1, 2 * b + 1, 0);
		} else {
			//gg.add_clause(2 * a, 1, 2 * b + 1, 0);
			//gg.add_clause(2 * a, 0, 2 * b + 1, 1);
			gg.add_clause(2 * a, 0, 2 * b + 1, 0);
			gg.add_clause(2 * a, 1, 2 * b + 1, 1);
		}
	}
	gg.build();
	if (!gg.IsSatisfiable) {
		printf("-1\n");
		return;
	}
	REP(i, 0, n) {
		bool is_1 = (gg.result[2 * i] && !gg.result[2 * i + 1]);
		bool is_3 = (!gg.result[2 * i] && gg.result[2 * i + 1]);
		if (is_1 || is_3) {
			ans[i] = '1';
		} else {
			ans[i] = '0';
		}
	}
	printf("%s\n", ans);
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
#endif
    //freopen(file".in", "r", stdin); freopen(file".out", "w", stdout);
    int t = 1;
    //cin >> t;
    while(t--){
        solve();
    }
}

提出情報

提出日時
問題 C - Honest or Liar or Confused
ユーザ Timur_Sitdikov
言語 C++ 20 (gcc 12.2)
得点 700
コード長 4945 Byte
結果 AC
実行時間 305 ms
メモリ 89816 KiB

コンパイルエラー

Main.cpp: In function ‘void solve()’:
Main.cpp:183:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
  183 |         scanf("%d%d", &n, &m);
      |         ~~~~~^~~~~~~~~~~~~~~~
Main.cpp:187:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
  187 |                 scanf("%d%d%d", &a, &b, &c);
      |                 ~~~~~^~~~~~~~~~~~~~~~~~~~~~

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 700 / 700
結果
AC × 3
AC × 41
セット名 テストケース
Sample sample-01.txt, sample-02.txt, sample-03.txt
All in-01.txt, in-02.txt, in-03.txt, in-04.txt, in-05.txt, in-06.txt, in-07.txt, in-08.txt, in-09.txt, in-10.txt, in-11.txt, in-12.txt, in-13.txt, in-14.txt, in-15.txt, in-16.txt, in-17.txt, in-18.txt, in-19.txt, in-20.txt, in-21.txt, in-22.txt, in-23.txt, in-24.txt, in-25.txt, in-26.txt, in-27.txt, in-28.txt, in-29.txt, in-30.txt, in-31.txt, in-32.txt, in-33.txt, in-34.txt, in-35.txt, in-36.txt, in-37.txt, in-38.txt, sample-01.txt, sample-02.txt, sample-03.txt
ケース名 結果 実行時間 メモリ
in-01.txt AC 22 ms 50696 KiB
in-02.txt AC 22 ms 50484 KiB
in-03.txt AC 22 ms 50600 KiB
in-04.txt AC 22 ms 50828 KiB
in-05.txt AC 305 ms 87980 KiB
in-06.txt AC 255 ms 80764 KiB
in-07.txt AC 223 ms 75520 KiB
in-08.txt AC 286 ms 83916 KiB
in-09.txt AC 263 ms 89804 KiB
in-10.txt AC 277 ms 89800 KiB
in-11.txt AC 276 ms 89784 KiB
in-12.txt AC 281 ms 89816 KiB
in-13.txt AC 262 ms 89076 KiB
in-14.txt AC 277 ms 88976 KiB
in-15.txt AC 279 ms 89052 KiB
in-16.txt AC 52 ms 60668 KiB
in-17.txt AC 166 ms 70220 KiB
in-18.txt AC 133 ms 67592 KiB
in-19.txt AC 55 ms 56388 KiB
in-20.txt AC 108 ms 62996 KiB
in-21.txt AC 52 ms 55652 KiB
in-22.txt AC 249 ms 83860 KiB
in-23.txt AC 95 ms 65428 KiB
in-24.txt AC 44 ms 55096 KiB
in-25.txt AC 32 ms 58080 KiB
in-26.txt AC 33 ms 58132 KiB
in-27.txt AC 32 ms 58232 KiB
in-28.txt AC 61 ms 58168 KiB
in-29.txt AC 64 ms 58428 KiB
in-30.txt AC 63 ms 58336 KiB
in-31.txt AC 59 ms 58096 KiB
in-32.txt AC 61 ms 58092 KiB
in-33.txt AC 43 ms 55488 KiB
in-34.txt AC 111 ms 67156 KiB
in-35.txt AC 29 ms 53504 KiB
in-36.txt AC 49 ms 56892 KiB
in-37.txt AC 79 ms 64888 KiB
in-38.txt AC 31 ms 57320 KiB
sample-01.txt AC 22 ms 50600 KiB
sample-02.txt AC 22 ms 50644 KiB
sample-03.txt AC 22 ms 50600 KiB