結果
問題 | No.5005 3-SAT |
ユーザー | rhoo |
提出日時 | 2022-07-07 19:40:15 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 1,983 ms / 2,000 ms |
コード長 | 4,431 bytes |
コンパイル時間 | 4,247 ms |
実行使用メモリ | 6,952 KB |
スコア | 108,329 |
最終ジャッジ日時 | 2022-07-07 19:43:48 |
合計ジャッジ時間 | 208,315 ms |
ジャッジサーバーID (参考情報) |
judge11 / judge15 |
純コード判定しない問題か言語 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1,983 ms
3,844 KB |
testcase_01 | AC | 1,981 ms
3,852 KB |
testcase_02 | AC | 1,982 ms
4,164 KB |
testcase_03 | AC | 1,982 ms
3,944 KB |
testcase_04 | AC | 1,983 ms
4,216 KB |
testcase_05 | AC | 1,982 ms
3,836 KB |
testcase_06 | AC | 1,982 ms
3,952 KB |
testcase_07 | AC | 1,983 ms
3,916 KB |
testcase_08 | AC | 1,982 ms
4,044 KB |
testcase_09 | AC | 1,983 ms
4,048 KB |
testcase_10 | AC | 1,983 ms
4,212 KB |
testcase_11 | AC | 1,982 ms
3,908 KB |
testcase_12 | AC | 1,982 ms
3,944 KB |
testcase_13 | AC | 1,983 ms
3,852 KB |
testcase_14 | AC | 1,982 ms
3,996 KB |
testcase_15 | AC | 1,982 ms
3,912 KB |
testcase_16 | AC | 1,981 ms
4,164 KB |
testcase_17 | AC | 1,982 ms
3,832 KB |
testcase_18 | AC | 1,982 ms
3,956 KB |
testcase_19 | AC | 1,982 ms
4,048 KB |
testcase_20 | AC | 1,982 ms
4,216 KB |
testcase_21 | AC | 1,982 ms
4,164 KB |
testcase_22 | AC | 1,981 ms
3,948 KB |
testcase_23 | AC | 1,982 ms
3,904 KB |
testcase_24 | AC | 1,982 ms
4,216 KB |
testcase_25 | AC | 1,982 ms
3,844 KB |
testcase_26 | AC | 1,983 ms
4,056 KB |
testcase_27 | AC | 1,982 ms
3,992 KB |
testcase_28 | AC | 1,982 ms
3,992 KB |
testcase_29 | AC | 1,982 ms
3,940 KB |
testcase_30 | AC | 1,983 ms
3,944 KB |
testcase_31 | AC | 1,983 ms
3,940 KB |
testcase_32 | AC | 1,982 ms
3,920 KB |
testcase_33 | AC | 1,983 ms
3,848 KB |
testcase_34 | AC | 1,982 ms
3,832 KB |
testcase_35 | AC | 1,982 ms
3,992 KB |
testcase_36 | AC | 1,982 ms
3,956 KB |
testcase_37 | AC | 1,982 ms
3,996 KB |
testcase_38 | AC | 1,983 ms
3,996 KB |
testcase_39 | AC | 1,982 ms
3,920 KB |
testcase_40 | AC | 1,982 ms
3,944 KB |
testcase_41 | AC | 1,982 ms
3,832 KB |
testcase_42 | AC | 1,982 ms
3,912 KB |
testcase_43 | AC | 1,983 ms
3,992 KB |
testcase_44 | AC | 1,983 ms
3,856 KB |
testcase_45 | AC | 1,983 ms
4,044 KB |
testcase_46 | AC | 1,982 ms
3,948 KB |
testcase_47 | AC | 1,981 ms
3,916 KB |
testcase_48 | AC | 1,982 ms
3,944 KB |
testcase_49 | AC | 1,982 ms
3,956 KB |
testcase_50 | AC | 1,983 ms
3,848 KB |
testcase_51 | AC | 1,983 ms
4,208 KB |
testcase_52 | AC | 1,981 ms
3,948 KB |
testcase_53 | AC | 1,982 ms
4,216 KB |
testcase_54 | AC | 1,982 ms
3,912 KB |
testcase_55 | AC | 1,982 ms
4,000 KB |
testcase_56 | AC | 1,982 ms
3,920 KB |
testcase_57 | AC | 1,981 ms
3,996 KB |
testcase_58 | AC | 1,981 ms
3,952 KB |
testcase_59 | AC | 1,983 ms
4,048 KB |
testcase_60 | AC | 1,982 ms
4,168 KB |
testcase_61 | AC | 1,982 ms
3,916 KB |
testcase_62 | AC | 1,981 ms
3,952 KB |
testcase_63 | AC | 1,983 ms
4,904 KB |
testcase_64 | AC | 1,982 ms
4,900 KB |
testcase_65 | AC | 1,983 ms
4,900 KB |
testcase_66 | AC | 1,983 ms
4,900 KB |
testcase_67 | AC | 1,981 ms
4,904 KB |
testcase_68 | AC | 1,982 ms
5,160 KB |
testcase_69 | AC | 1,982 ms
4,900 KB |
testcase_70 | AC | 1,982 ms
4,904 KB |
testcase_71 | AC | 1,982 ms
5,156 KB |
testcase_72 | AC | 1,982 ms
4,900 KB |
testcase_73 | AC | 1,983 ms
5,156 KB |
testcase_74 | AC | 1,982 ms
4,900 KB |
testcase_75 | AC | 1,982 ms
4,904 KB |
testcase_76 | AC | 1,982 ms
5,156 KB |
testcase_77 | AC | 1,982 ms
4,904 KB |
testcase_78 | AC | 1,982 ms
4,904 KB |
testcase_79 | AC | 1,983 ms
5,156 KB |
testcase_80 | AC | 1,982 ms
4,900 KB |
testcase_81 | AC | 1,982 ms
5,156 KB |
testcase_82 | AC | 1,982 ms
5,160 KB |
testcase_83 | AC | 1,982 ms
4,904 KB |
testcase_84 | AC | 1,982 ms
4,900 KB |
testcase_85 | AC | 1,982 ms
4,904 KB |
testcase_86 | AC | 1,982 ms
4,900 KB |
testcase_87 | AC | 1,981 ms
4,904 KB |
testcase_88 | AC | 1,982 ms
4,904 KB |
testcase_89 | AC | 1,982 ms
4,900 KB |
testcase_90 | AC | 1,983 ms
4,904 KB |
testcase_91 | AC | 1,983 ms
4,904 KB |
testcase_92 | AC | 1,982 ms
4,904 KB |
testcase_93 | AC | 1,981 ms
4,900 KB |
testcase_94 | AC | 1,982 ms
4,904 KB |
testcase_95 | AC | 1,982 ms
4,904 KB |
testcase_96 | AC | 1,983 ms
4,904 KB |
testcase_97 | AC | 1,983 ms
4,904 KB |
testcase_98 | AC | 1,982 ms
5,156 KB |
testcase_99 | AC | 1,982 ms
6,952 KB |
ソースコード
#include "bits/stdc++.h" using namespace std; // #define LOCAL using usize=unsigned long long; using i64=long long; using f64=double; template<typename T> using Vec=vector<T>; __attribute__((constructor)) void constructor(){cin.tie(nullptr);cin.sync_with_stdio(false);} namespace rnd{ static usize S=88172645463325252; inline usize next(){ S^=S<<7; S^=S>>9; return S; } } inline f64 get_time(){ static f64 START=-1.; timespec ts; timespec_get(&ts,TIME_UTC); f64 t=f64(ts.tv_sec)+f64(ts.tv_nsec)*1e-9; if(START<0){START=t;} return t-START; } #ifdef LOCAL #define debug(...) debug_sub(0,#__VA_ARGS__,__VA_ARGS__) template<typename N,typename T> void debug_sub(int i,const N& name,const T& a){ for(;name[i]!=',' && name[i]!='\0';++i) cerr<<name[i]; cerr<<": "<<a<<endl; } template<typename N,typename T1,typename... T2> void debug_sub(int i,const N& name,const T1& a,const T2& ...b){ for(;name[i]!=',' && name[i]!='\0';++i) cerr<<name[i]; cerr<<": "<<a<<", "; debug_sub(i+1,name,b...); } #else #define debug(...) #endif constexpr usize N=256; constexpr usize M=2048; struct In{ array<array<Vec<usize>,2>,N> edge{}; inline In(){ usize id[3]; usize f[3]; for(usize i=0;i<M;++i){ cin>>id[0]>>id[1]>>id[2]>>f[0]>>f[1]>>f[2]; for(usize j=0;j<3;++j){ edge[id[j]][f[j]].emplace_back(i); } } } }; struct Out{ array<bool,N> out{}; array<usize,M> cnt{}; array<array<Vec<usize>,2>,N> edge{}; inline Out(){ usize r=!0; for(usize i=0;i<N;++i){ if((i&63)==0){ r=rnd::next(); } out[i]=(r&1)==0; r>>=1; } } inline void re(In& input,usize r){ cnt.fill(0); for(usize i=0;i<N;++i){ for(usize j=0;j<2;++j){ edge[i][j].clear(); for(const auto k:input.edge[i][j]){ if(k<r){ edge[i][j].emplace_back(k); } } } for(const auto j:edge[i][out[i]]){ ++cnt[j]; } } } inline i64 score(){ i64 ret=0; for(const auto i:cnt){ ret+=(i!=0); } return ret; } inline bool change(i64 add,usize idx,i64& score){ i64 diff=0; bool f=out[idx]; for(const auto i:edge[idx][f]){ --cnt[i]; diff-=cnt[i]==0; } for(const auto i:edge[idx][!f]){ ++cnt[i]; diff+=cnt[i]==1; } if(add<=diff){ score+=diff; out[idx]=!f; return true; } for(const auto i:edge[idx][f]) ++cnt[i]; for(const auto i:edge[idx][!f]) --cnt[i]; return false; } }; constexpr f64 TL=1.98; bool sa(usize r,Out& cur,usize lim){ i64 score=cur.score(); usize iter=0; usize up=0; array<i64,256> th; for(;;){ if((iter&2047)==0){ if(get_time()>=TL) break; f64 p=f64(iter)/f64(lim); if(p>=1.) break; constexpr f64 T=0.3; f64 heat=T*(1.-p); usize id=0; do{ usize r=rnd::next(); th[id]=heat*log(f64(r&4294967295)/4294967296.); th[id+1]=heat*log(f64(r>>32)/4294967296.); id+=2; }while(id<th.size()); } ++iter; if(cur.change(th[iter&255],rnd::next()%N,score)){ if(score==r) break; ++up; } } f64 p=f64(up)/f64(iter); debug(r,iter,p); debug(score); assert(score==cur.score()); return score==r; } array<bool,256> solve(In& input){ Out out; array<bool,256> ans=out.out; usize best=0; usize pos=1000; usize iter=0; while(get_time()<=TL){ ++iter; out.re(input,pos); if(sa(pos,out,2000000)){ ans=out.out; best=pos; pos+=4; } else{ out.out=ans; pos=best+1; } } debug(iter); debug(best); return ans; } int main(){ In input; array<bool,256> ans=solve(input); for(i64 i=ans.size()-1;0<=i;--i){ cout<<ans[i]; } cout<<endl; }