結果
問題 | No.5005 3-SAT |
ユーザー |
👑 |
提出日時 | 2022-08-20 08:47:37 |
言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 339 ms / 2,000 ms |
コード長 | 5,917 bytes |
コンパイル時間 | 1,092 ms |
実行使用メモリ | 3,596 KB |
スコア | 48,964 |
最終ジャッジ日時 | 2022-08-20 08:47:57 |
合計ジャッジ時間 | 18,075 ms |
ジャッジサーバーID (参考情報) |
judge13 / judge15 |
純コード判定しない問題か言語 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 100 |
ソースコード
#include <iostream> #include <list> #include <vector> #include <string> #include <stdio.h> #include <stdint.h> #include <iomanip> using namespace std; using uint = unsigned int; using ll = long long; #define CIN( LL , A ) LL A; cin >> A #define GETLINE( A ) string A; getline( cin , A ) #define GETLINE_SEPARATE( A , SEPARATOR ) string A; getline( cin , A , SEPARATOR ) #define FOR_LL( VAR , INITIAL , FINAL_PLUS_ONE ) for( ll VAR = INITIAL ; VAR < FINAL_PLUS_ONE ; VAR ++ ) #define FOR_ITR( ARRAY , ITR , END ) for( auto ITR = ARRAY .begin() , END = ARRAY .end() ; ITR != END ; ITR ++ ) #define REPEAT( HOW_MANY_TIMES ) FOR_LL( VARIABLE_FOR_REPEAT , 0 , HOW_MANY_TIMES ) #define RETURN( ANSWER ) cout << ( ANSWER ) << endl; return 0 #define DOUBLE( PRECISION , ANSWER ) cout << fixed << setprecision( PRECISION ) << ( ANSWER ) << endl; return 0 #define MIN( A , B ) A < B ? A : B; #define MAX( A , B ) A < B ? B : A; template <typename T> inline T Distance( const T& a , const T& b ){ return a < b ? b - a : a - b; } #include <initializer_list> // 自分のライブラリ(https://github.com/p-adic/cpp)よりソースコードをコピーして編集している。 template <typename T , uint D> class AffineSpace { private: T m_v[D]; public: inline AffineSpace(); inline AffineSpace( const initializer_list<T> init ); template <uint E> inline AffineSpace( const T (&v)[E] ); template <uint E> inline AffineSpace( const AffineSpace<T,E>& x ); // E < Dの場合のみサポート template <typename... ARGS> inline AffineSpace( const uint& E , const ARGS&... args ); template <uint E> inline AffineSpace<T,D>& operator=( const AffineSpace<T,E>& x ); T& operator[]( const uint& i ); const T& operator[]( const uint& i ) const; private: template <uint E> void Set( const T (&v)[E] ); void Substitute( const initializer_list<T> init ); template <uint E> void Substitute( const T (&v)[E] ); template <uint E> void Substitute( const AffineSpace<T,E>& x ); }; template <typename T , uint D> inline AffineSpace<T,D>::AffineSpace() : m_v() {}; template <typename T , uint D> inline AffineSpace<T,D>::AffineSpace( const initializer_list<T> init ) : m_v() { Substitute( init ); } template <typename T , uint D> template <uint E> inline AffineSpace<T,D>::AffineSpace( const T (&v)[E] ) : m_v() { Substitute<E>( v ); } template <typename T , uint D> template <uint E> inline AffineSpace<T,D>::AffineSpace( const AffineSpace<T,E>& x ) : m_v() { Substitute<E>( x ); } template <typename T , uint D> template <typename... ARGS> inline AffineSpace<T,D>::AffineSpace( const uint& E , const ARGS&... args ) : AffineSpace( args... ) { m_v[E]++; } template <typename T , uint D> template <uint E> inline AffineSpace<T,D>& AffineSpace<T,D>::operator=( const AffineSpace<T,E>& x ) { Set<E>( x.m_v ); return *this; } template <typename T , uint D> inline T& AffineSpace<T,D>::operator[]( const uint& i ) { return m_v[i]; } template <typename T , uint D> inline const T& AffineSpace<T,D>::operator[]( const uint& i ) const { return m_v[i]; } template <typename T , uint D> template <uint E> void AffineSpace<T,D>::Set( const T (&v)[E] ) { Substitute( v ); constexpr const uint min = E < D ? E : D; for( uint i = min ; i < D ; i++ ){ m_v[i] = 0; } return; } template <typename T , uint D> void AffineSpace<T,D>::Substitute( const initializer_list<T> init ) { const uint size = init.size(); const uint min = size < D ? size : D; auto itr = init.begin(); for( uint i = 0 ; i < min ; i++ ){ m_v[i] = *itr; itr++; } return; } template <typename T , uint D> template <uint E> void AffineSpace<T,D>::Substitute( const T (&v)[E] ) { constexpr const uint min = E < D ? E : D; for( uint i = 0 ; i < min ; i++ ){ m_v[i] = v[i]; } return; } template <typename T , uint D> template <uint E> void AffineSpace<T,D>::Substitute( const AffineSpace<T,E>& x ) { constexpr const uint min = E < D ? E : D; for( uint i = 0 ; i < min ; i++ ){ m_v[i] = x[i]; } return; } #define N 2048 #define D 256 bool CheckSolution( const list<AffineSpace<ll,6> >& restriction , const AffineSpace<ll,D>& x ); int main() { AffineSpace<ll,D> x{}; list<AffineSpace<ll,6> > restriction{}; FOR_LL( i , 0 , N ){ CIN( uint , a ); CIN( uint , b ); CIN( uint , c ); CIN( ll , p ); CIN( ll , q ); CIN( ll , r ); restriction.push_back( AffineSpace<ll,6>( { a , b , c , p , q , r } ) ); bool solvable = CheckSolution( restriction , x ); if( ! solvable ){ FOR_LL( d , 0 , D ){ x[d] = 1 - x[d]; if( CheckSolution( restriction , x ) ){ solvable = true; d = D; } else { x[d] = 1 - x[d]; } } } if( ! solvable ){ FOR_LL( d0 , 0 , D ){ FOR_LL( d1 , 0 , D ){ x[d0] = 1 - x[d0]; x[d1] = 1 - x[d1]; if( CheckSolution( restriction , x ) ){ solvable = true; d0 = D; d1 = D; } else { x[d0] = 1 - x[d0]; x[d1] = 1 - x[d1]; } } } } if( ! solvable ){ if( i < 10 ){ FOR_LL( d0 , 0 , D ){ FOR_LL( d1 , 0 , D ){ FOR_LL( d2 , 0 , D ){ x[d0] = 1 - x[d0]; x[d1] = 1 - x[d1]; x[d2] = 1 - x[d2]; if( CheckSolution( restriction , x ) ){ solvable = true; d0 = D; d1 = D; d2 = D; } else { x[d0] = 1 - x[d0]; x[d1] = 1 - x[d1]; x[d2] = 1 - x[d2]; } } } } } } if( ! solvable ){ i = N; } } FOR_LL( d , 0 , D ){ cout << x[D - 1 - d]; } RETURN( "" ); } bool CheckSolution( const list<AffineSpace<ll,6> >& restriction , const AffineSpace<ll,D>& x ) { FOR_ITR( restriction , itr , end ){ const AffineSpace<ll,6>& r = *itr; bool b = false; FOR_LL( k , 0 , 3 ){ if( x[r[k]] == r[k+3] ){ b = true; k = 3; } } if( !b ){ return false; } } return true; }