結果
| 問題 | No.3418 【絶望】30個並列ごちゃ混ぜHit&Blowで遊ぼう! |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-12-05 21:47:54 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.89.0) |
| 結果 |
MLE
|
| 実行時間 | - |
| コード長 | 4,273 bytes |
| 記録 | |
| コンパイル時間 | 6,211 ms |
| コンパイル使用メモリ | 326,052 KB |
| 実行使用メモリ | 825,784 KB |
| スコア | 0 |
| 最終ジャッジ日時 | 2025-12-24 23:34:23 |
| 合計ジャッジ時間 | 11,211 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | MLE * 1 -- * 99 |
ソースコード
#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);
}
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;
priority_queue<pair<double,pi>> pq;
vector<his> hv;
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]){
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;
pq.push({app,{i,nx}});
}
}
}
}
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=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();
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;
pq.push({app,{i,nx}});
}
}
}
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]);
pq.push({-1.0,{-1,i}});
}
int pac=0;
for(int cq=0;;cq++){
string q;
while(true){
auto od=pq.top(); pq.pop();
if(od.second.first<0){
cerr << od.first << "\n";
q=slis[od.second.second];
break;
}
else if(od.first<=prbs[od.second.first][od.second.second]){
cerr << od.first << "\n";
q=slis[od.second.second];
break;
}
}
auto ar=ask(q);
int ac=0;
for(auto &nx : ar){
if(nx==30){ac++;}
}
if(pac!=ac){
if(alive[sinv[q]]){
alive[sinv[q]]=0;
incl(q);
}
}
else{
if(alive[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(int i=0;i<slis.size();i++){
if(alive[i]){
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]){
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;
// cerr << app << " " << cq << " " << nx << "\n";
pq.push({app,{cq,nx}});
}
}
}
hv.push_back(cur);
while(!dead_q.empty()){
auto od=dead_q.front();
dead_q.pop();
excl(slis[od]);
}
}
}