Submission #238524

#TimeUsernameProblemLanguageResultExecution timeMemory
238524SortingFishing Game (RMI19_fishing)C++14
100 / 100
249 ms173688 KiB
#include <bits/stdc++.h> using namespace std; const long long k_Mod = 1e9 + 7; const int k_N = 100 + 3; typedef long long ll; int n; pair<int, bool> dp[3 * k_N][3 * k_N][3 * k_N][3][2]; long long get_answer(int ab, int ac, int bc, int stage, bool discarded){ if(ab + ac + bc == 0) return 1; if(!stage){ if(!discarded) return false; discarded = false; } //cout << ab << " " << ac << " " << bc << " " << stage << endl; auto &[answer, solved] = dp[ab][ac][bc][stage][discarded]; if(solved) return answer; solved = true; answer = 0; if(stage == 0){ if(ab + ac == 0) return answer = get_answer(ab, ac, bc, 1, discarded); if(ab) answer += get_answer(ab - 1, ac, bc, 1, true) * (ll)ab % k_Mod; if(ac) answer += get_answer(ab, ac - 1, bc + 1, 1, discarded) * (ll)ac % k_Mod; return answer %= k_Mod; } if(stage == 1){ if(ab + bc == 0) return answer = get_answer(ab, ac, bc, 2, discarded); if(ab) answer += get_answer(ab - 1, ac + 1, bc, 2, discarded) * (ll)ab % k_Mod; if(bc) answer += get_answer(ab, ac, bc - 1, 2, true) * (ll)bc % k_Mod; return answer %= k_Mod; } if(stage == 2){ if(ac + bc == 0) return answer = get_answer(ab, ac, bc, 0, discarded); if(ac) answer += get_answer(ab, ac - 1, bc, 0, true) * (ll)ac % k_Mod; if(bc) answer += get_answer(ab + 1, ac, bc - 1, 0, discarded) * (ll)bc % k_Mod; return answer %= k_Mod; } assert(false); return -1; } void solve_test(){ static pair<int, int> pos[3 * k_N]; for(int i = 1; i <= 3 * n; ++i) pos[i] = {-1, -1}; int x; for(int i = 0; i < 2 * n; ++i){ cin >> x; if(pos[x].first == -1) pos[x].first = 0; else pos[x].second = 0; } for(int i = 0; i < 2 * n; ++i){ cin >> x; if(pos[x].first == -1) pos[x].first = 1; else pos[x].second = 1; } for(int i = 0; i < 2 * n; ++i){ cin >> x; if(pos[x].first == -1) pos[x].first = 2; else pos[x].second = 2; } int ab = 0, ac = 0, bc = 0; for(int i = 1; i <= 3 * n; ++i){ if(pos[i].first == pos[i].second) continue; //if(pos[i].first > pos[i].second) // swap(pos[i].first, pos[i].second); if(pos[i].second == 1) ab++; else if(pos[i].first == 0) ac++; else bc++; } //cout << ab << " " << ac << " " << bc << endl; cout << get_answer(ab, ac, bc, 0, true) << "\n"; } int main(){ ios::sync_with_stdio(false); cin.tie(NULL); int t; cin >> n >> t; while(t--) solve_test(); }

Compilation message (stderr)

fishing.cpp: In function 'long long int get_answer(int, int, int, int, bool)':
fishing.cpp:24:11: warning: decomposition declaration only available with -std=c++1z or -std=gnu++1z
     auto &[answer, solved] = dp[ab][ac][bc][stage][discarded];
           ^
#Verdict Execution timeMemoryGrader output
Fetching results...