結果
問題 | No.624 Santa Claus and The Last Dungeon |
ユーザー |
![]() |
提出日時 | 2017-12-24 11:57:05 |
言語 | C++11 (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 44 ms / 2,000 ms |
コード長 | 2,761 bytes |
コンパイル時間 | 2,813 ms |
コンパイル使用メモリ | 167,012 KB |
実行使用メモリ | 25,208 KB |
平均クエリ数 | 377.42 |
最終ジャッジ日時 | 2024-07-16 15:10:09 |
合計ジャッジ時間 | 4,895 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 36 |
コンパイルメッセージ
main.cpp: In function ‘void query()’: main.cpp:30:8: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 30 | scanf("%d%d%d",&p0,&p1,&p2); | ~~~~~^~~~~~~~~~~~~~~~~~~~~~ main.cpp: In function ‘int main()’: main.cpp:140:8: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 140 | scanf("%d%d%d",&p0,&p1,&p2); | ~~~~~^~~~~~~~~~~~~~~~~~~~~~
ソースコード
#include <bits/stdc++.h>using namespace std;#define REP(i,n) for(int i=0;i<(int)(n);i++)#define FOR(i,a,b) for(int i=(int)(a);i<(int)(b);i++)#define FORR(i,a,b) for(int i=(int)(b)-1;i>=(int)(a);i--)typedef long long ll;typedef vector<int> vi;int perm[125];int revperm[125];char s[353];int p0, p1, p2;void clear(){REP(i,100){s[3*i] = s[3*i+1] = '?';s[3*i+2] = ' ';}s[299] = '\0';}void setval(int p, int u, int d){p = perm[p];s[3*p+0] = u==-1 ? '?' : '0'+u;s[3*p+1] = d==-1 ? '?' : '0'+d;}void query(){puts(s);fflush(stdout);scanf("%d%d%d",&p0,&p1,&p2);}int u[125];int d[125];void solve_d(vi cand, int rest, int val){if(cand.size() == rest){// all okREP(i,cand.size()){d[cand[i]] = val;}return;}if(rest == 0){return;}// split into 2 segmentint m = cand.size() / 2;clear();REP(i,m)setval(cand[i], -1, val);query();vi va, vb;REP(i,m)va.push_back(cand[i]);FOR(i,m,cand.size())vb.push_back(cand[i]);int x = p1;int y = rest-p1;solve_d(va, x, val);solve_d(vb, y, val);}void dfs_u(vi ca, vi cb, vi va, vi vb){if(ca.size() == 1){u[ca[0]] = va[0];u[cb[0]] = vb[0];return;}int n = ca.size();vi lca, rca, lcb, rcb, lva, rva, lvb, rvb;REP(i,n/2){lca.push_back(ca[i]);lcb.push_back(cb[i]);}FOR(i,n/2,n){rca.push_back(ca[i]);rcb.push_back(cb[i]);}REP(i,n-1){int a = va[i];int b = vb[i];clear();REP(j,lca.size()){setval(lca[j], a, -1);setval(lcb[j], b, d[lcb[j]]);}query();int x = p1, y = p2;if(y==1){// b in leftlvb.push_back(b);x++;}else{rvb.push_back(b);}if(x==lca.size()+1){// a in leftlva.push_back(a);}else{rva.push_back(a);}}(lva.size()==lca.size() ? rva : lva).push_back(va.back());(lvb.size()==lcb.size() ? rvb : lvb).push_back(vb.back());dfs_u(lca, lcb, lva, lvb);dfs_u(rca, rcb, rva, rvb);}void solve_u(int a, int b){vi ca, cb;REP(i,100){if(d[i]==a)ca.push_back(i);if(d[i]==b)cb.push_back(i);}vi va, vb;REP(i,10)va.push_back(i);REP(i,10)vb.push_back(i);dfs_u(ca, cb, va, vb);}int main(){int q;cin>>q;REP(i,100)u[i] = d[i] = -1;// randomizesrand(time(NULL));REP(i,100)perm[i] = i;random_shuffle(perm, perm+100);REP(i,100)revperm[perm[i]] = i;// solve for dREP(i,10){vi cand;REP(j,100)if(d[j]==-1)cand.push_back(j);solve_d(cand, 10, i);}// solve for uREP(i,5){solve_u(2*i, 2*i+1);}// okREP(i,100)printf("%d%d%c",u[revperm[i]],d[revperm[i]],i==99?'\n':' ');fflush(stdout);scanf("%d%d%d",&p0,&p1,&p2);return 0;}