結果
| 問題 |
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;
}