Submission #72542

#TimeUsernameProblemLanguageResultExecution timeMemory
72542 (#118)Key of Impassable Doors (FXCUP3_key)C++17
0 / 100
2 ms612 KiB
#include<bits/stdc++.h> #include"key.h" using namespace std; int sz[1005]; bool ex[1005]; int out[1005], mb[1005]; vector<int> cycle[1005]; bool is_cycle(int i, int N) { if(ex[sz[i]] < sz[i]) return false; vector<int> cand; for(int j=i+1;j<=N;j++) { if(sz[i] == sz[j] && !mb[j]) cand.push_back(j); } if(cand.size() == sz[i]-1) { cand.push_back(i); sort(cand.begin(), cand.end()); TakeKey(cand[0]); TakeKey(cand.back()); int ret = Explore(); if(ret != sz[i]) return false; int x = cand[0]; for(int j : cand) { cycle[x].push_back(j); mb[j] = x; } } else { vector<int> rcand; random_shuffle(cand.begin(), cand.end()); for(int k=0; k < cand.size(); k++) { int j = cand[k]; TakeKey(i); TakeKey(j); int ret = Explore(); if(ret == sz[i]) rcand.push_back(j); else if(rcand.size() + (cand.size() - k) < sz[i]) return false; if(rcand.size() == sz[i]-1) break; } rcand.push_back(i); sort(rcand.begin(), rcand.end()); int x = rcand[0]; for(int j : rcand) { cycle[x].push_back(j); mb[j] = x; } } return true; } bool is_tail(int i, int N) { vector<int> cand; if(ex[sz[i]-1]) { for(int j=1;j<=N;j++) { if(sz[j] == sz[i]-1) cand.push_back(j); } random_shuffle(cand.begin(), cand.end()); for(int j : cand) { TakeKey(i); TakeKey(j); int ret = Explore(); if(ret == sz[i]) { out[i] = j; return true; } } } return false; } void EnsureKeyInfo(int N){ mt19937 mt(random_device{}()); for(int i=1;i<=N;i++) { TakeKey(i); sz[i] = Explore(); if(sz[i] == 1) out[i] = i; ex[sz[i]] = true; } for(int i=1;i<=N;i++) { if(mb[i] || out[i]) continue; if(mt()&1) { if(is_tail(i,N)) { continue; } is_cycle(i,N); } else { if(is_cycle(i,N)) { continue; } is_tail(i,N); } } for(int i=1;i<=N;i++) { if(mb[i]) { if(cycle[i].empty()) continue; for(int x : cycle[i]) { for(int y : cycle[i]) { Report(x,y); } } } else { int prv = i; Report(i,i); int x = out[i]; while(x != prv) { if(mb[x]) { for(int j : cycle[mb[x]]) { Report(i, j); } break; } else { Report(i, x); prv = x; x = out[x]; } } } } }

Compilation message (stderr)

key.cpp: In function 'bool is_cycle(int, int)':
key.cpp:16:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if(cand.size() == sz[i]-1) {
      ~~~~~~~~~~~~^~~~~~~~~~
key.cpp:31:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int k=0; k < cand.size(); k++) {
                  ~~^~~~~~~~~~~~~
key.cpp:37:48: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
       else if(rcand.size() + (cand.size() - k) < sz[i]) return false;
               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~
key.cpp:38:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
       if(rcand.size() == sz[i]-1) break;
          ~~~~~~~~~~~~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...