Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2017
249
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.42 KB | None | 0 0
  1. // CONTEST SOURCE
  2. #include <iostream>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <cstdio>
  6. #include <vector>
  7. #include <cmath>
  8. #include <algorithm>
  9. #include <map>
  10. #include <queue>
  11. #include <set>
  12. #include <climits>
  13. //#include <priority_queue>
  14. using namespace std;
  15. #define ll long long
  16. #define x first
  17. #define y second
  18. #define pii pair<int, int>
  19. #define pdd pair<double, double>
  20. #define L(s) (int)(s).size()
  21. #define VI vector<int>
  22. #define all(s) (s).begin(), (s).end()
  23. #define pb push_back
  24. #define mp make_pair
  25. #define inf 1000000000
  26. int t, n, p, q, r, pq, qr, rp;
  27. int e[6][6];
  28. char path[1111];
  29. int ptr;
  30. void dfs(int v) {
  31.   for(int j = 0; j < 6; ++j) {
  32.     while(e[v][j]) {
  33.       --e[v][j];
  34.       dfs(j);
  35.     }
  36.   }
  37.   if (v == 0) path[ptr++] = 'R'; else
  38.     if (v == 1) path[ptr++] = 'Y'; else
  39.       if (v == 2) path[ptr++] = 'B'; else
  40.         if (v == 3) path[ptr++] = 'G'; else
  41.           if (v == 4) path[ptr++] = 'V'; else
  42.             if (v == 5) path[ptr++] = 'O';
  43. }
  44. bool solve() {
  45.     if (p < qr || q < rp || r < pq) return 0;
  46.     for(int p2q = 0; p2q <= p - qr && p2q <= q - rp; ++p2q) {
  47.       e[0][3] = qr;
  48.       e[3][0] = qr;
  49.       e[1][4] = rp;
  50.       e[4][1] = rp;
  51.       e[2][5] = pq;
  52.       e[5][2] = pq;
  53.  
  54.       e[0][1] = p2q;
  55.       e[0][2] = p - e[0][3] - e[0][1];
  56.       e[2][1] = q - e[0][1] - e[4][1];
  57.       e[2][0] = r - e[2][5] - e[2][1];
  58.       e[1][2] = r - e[0][2] - e[5][2];
  59.       e[1][0] = p - e[3][0] - e[2][0];
  60.  
  61.       if (e[0][2] < 0 || e[2][1] < 0 || e[2][0] < 0 || e[1][2] < 0 || e[1][0] < 0) continue;
  62.       if (e[0][1] + e[0][2] + e[0][3] != p) continue;
  63.       if (e[1][0] + e[2][0] + e[3][0] != p) continue;
  64.       if (e[1][0] + e[1][2] + e[1][4] != q) continue;
  65.       if (e[0][1] + e[2][1] + e[4][1] != q) continue;
  66.       if (e[2][0] + e[2][1] + e[2][5] != r) continue;
  67.       if (e[0][2] + e[1][2] + e[5][2] != r) continue;
  68.  
  69.       int idx = 0; while(e[idx][0] + e[idx][1] + e[idx][2] == 0) ++idx;
  70.  
  71.       ptr = 0;
  72.       dfs(idx);
  73.  
  74.       if (ptr != n + 1) continue;
  75.       path[n] = 0;
  76.       return 1;
  77.     }
  78.     return 0;
  79. }
  80. int main() {
  81.   freopen("B-small-attempt0.in", "r", stdin);
  82.   freopen("output.txt", "w", stdout);
  83.   cin >> t;
  84.   for(int tc = 1; tc <= t; ++tc) {
  85.     cerr << tc << endl;
  86.     cin >> n;
  87.     cin >> p >> pq >> q >> qr >> r >> rp;
  88.     cout << "Case #" << tc << ": ";
  89.     if (!solve()) cout << "IMPOSSIBLE\n";
  90.     else cout << path << endl;
  91.   }
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement