結果
| 問題 | No.3418 【絶望】30個並列ごちゃ混ぜHit&Blowで遊ぼう! |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-12-06 06:37:36 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 1,574 ms / 5,000 ms |
| コード長 | 4,427 bytes |
| 記録 | |
| コンパイル時間 | 4,391 ms |
| コンパイル使用メモリ | 325,716 KB |
| 実行使用メモリ | 40,452 KB |
| スコア | 9,994,663 |
| 平均クエリ数 | 53.37 |
| 最終ジャッジ日時 | 2025-12-24 23:52:10 |
| 合計ジャッジ時間 | 127,943 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
| 純コード判定しない問題か言語 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 100 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
bool check(string s){
sort(s.begin(),s.end());
for(int i=1;i<s.size();i++){
if(s[i-1]==s[i]){return false;}
}
return true;
}
using pi=pair<int,int>;
vector<int> ask(string s){
cout << s << "\n";
fflush(stdout);
vector<pi> res(30);
vector<int> rv;
for(int i=0;i<30;i++){
cin >> res[i].first >> res[i].second;
rv.push_back(res[i].first*6+res[i].second);
}
// cerr << "done\n";
if(res[0].first==5 || res[0].first<0){exit(0);} // finish
return rv;
}
int hbc(string s,string t){
int res=0;
for(int k=0;k<5;k++){
if(s[k]==t[k]){res+=6;}
}
for(int k=0;k<5;k++){
for(int l=0;l<5;l++){
if(k==l){continue;}
if(s[k]==t[l]){res++;}
}
}
return res;
}
typedef struct{
string q;
vector<int> rem;
vector<vector<int>> v;
}his;
vector<int> alive;
vector<string> slis;
map<string,int> sinv;
queue<int> dead_q;
vector<vector<double>> prbs;
vector<double> prb;
vector<his> hv;
set<int> ast;
void incl(string s){
int sid=sinv[s];
for(int i=0;i<hv.size();i++){
int tg=hbc(s,hv[i].q);
int p=0;
for(int j=0;j<hv[i].v[tg].size();j++){
if(hv[i].v[tg][j]==sid){p=j; break;}
}
swap(hv[i].v[tg][p],hv[i].v[tg].back());
hv[i].v[tg].pop_back();
hv[i].rem[tg]--;
if(hv[i].v[tg].empty()){continue;}
if(hv[i].rem[tg]==0){
for(auto &nx : hv[i].v[tg]){
if(alive[nx]){
ast.erase(nx);
alive[nx]=0;
dead_q.push(nx);
}
}
}
else{
double app=hv[i].rem[tg];
app/=hv[i].v[tg].size();
for(auto &nx : hv[i].v[tg]){
prbs[i][nx]=app;
}
}
}
}
void excl(string s){
int sid=sinv[s];
for(int i=0;i<hv.size();i++){
int tg=hbc(s,hv[i].q);
int p=-1;
for(int j=0;j<hv[i].v[tg].size();j++){
if(hv[i].v[tg][j]==sid){p=j; break;}
}
if(p==-1){continue;}
swap(hv[i].v[tg][p],hv[i].v[tg].back());
hv[i].v[tg].pop_back();
if(hv[i].v[tg].empty()){continue;}
double app=hv[i].rem[tg];
app/=hv[i].v[tg].size();
for(auto &nx : hv[i].v[tg]){
prbs[i][nx]=app;
}
}
}
int main(){
vector<int> remp(32,0);
vector<vector<int>> vemp(32);
for(int i=0;i<=99999;i++){
int v=i;
string cur;
for(int j=0;j<5;j++){
cur.push_back('0'+v%10);
v/=10;
}
reverse(cur.begin(),cur.end());
if(check(cur)){
sinv[cur]=slis.size();
slis.push_back(cur);
alive.push_back(1);
}
}
prb.resize(slis.size());
vector<double> prb_ini;
for(int i=0;i<slis.size();i++){
prb[i]=0.0;
prb_ini.push_back(prb[i]);
ast.insert(i);
}
int pac=0;
int head=1;
for(int cq=0;;cq++){
string q="";
if(cq==0){q="01234";}
else{
int bi=-1,bj=-1;
for(int i=0;i<prbs.size();i++){
for(auto j : ast){
if(bi==-1){bi=i; bj=j;}
if(prbs[bi][bj]<prbs[i][j]){bi=i; bj=j;}
}
}
if(prbs[bi][bj]>0.6){q=slis[bj];}
else if(head<=9){
for(int pt=0;pt<5;pt++){
q.push_back('0'+((head+pt)%10));
}
head++;
}
else{q=slis[bj];}
// cerr << prbs[bi][bj] << "\n";
}
auto ar=ask(q);
int ac=0;
for(auto &nx : ar){
if(nx==30){ac++;}
}
if(pac!=ac){
if(alive[sinv[q]]){
ast.erase(sinv[q]);
alive[sinv[q]]=0;
incl(q);
}
}
else{
if(alive[sinv[q]]){
ast.erase(sinv[q]);
alive[sinv[q]]=0;
excl(q);
}
}
pac=ac;
his cur;
cur.q=q;
cur.rem=remp;
cur.v=vemp;
for(auto &nx : ar){
if(nx<30){cur.rem[nx]++;}
}
for(auto i : ast){
int tg=hbc(q,slis[i]);
cur.v[tg].push_back(i);
}
prbs.push_back(prb_ini);
for(int i=0;i<30;i++){
if(cur.v[i].size()==0){continue;}
if(cur.rem[i]==0){
for(auto &nx : cur.v[i]){
if(alive[nx]){
ast.erase(nx);
alive[nx]=0;
dead_q.push(nx);
}
}
}
else{
double app=cur.rem[i];
app/=cur.v[i].size();
for(auto &nx : cur.v[i]){
prbs[cq][nx]=app;
}
}
}
hv.push_back(cur);
while(!dead_q.empty()){
auto od=dead_q.front();
dead_q.pop();
excl(slis[od]);
}
cerr << (cq+1) << " : " << (30-pac) << " " << ast.size() << "\n";
}
}