Advertisement
Guest User

Untitled

a guest
Jun 28th, 2017
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.59 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <vector>
  3. #include <string.h>
  4. #include <memory.h>
  5. using namespace std;
  6.  
  7. #define N 32
  8. #define M 5222
  9. #define FRONT 1
  10. #define REAR 2
  11. #define LEFT 0
  12. #define RIGHT 1
  13. int dir[N],h[N];
  14. vector<int> a[M],toleft[M],toright[M];
  15. int ver,variant,n;
  16.  
  17. struct cell {
  18.   int x,y,z;
  19. } W;
  20. vector<cell> need;
  21.  
  22. void get_quary() {
  23.   char b[5]; scanf("%s",b);
  24.   int len = strlen(b);
  25.   if (b[n-1] == 'F') variant = FRONT;
  26.   else variant = REAR;
  27.   if (n == 2) ver = b[0]-'0';
  28.   else ver = (b[0]-'0')*10 + (b[1]-'0');
  29. }
  30.  
  31. void del_first(vector<int>& a) {
  32.   for (int i=0;i+1<a.size();i++) a[i+1] = a[i];
  33.   a.pop_back();
  34. }
  35.  
  36. void add_first(vector<int>& a, int x) {
  37.   vector<int> b = a;
  38.   a.clear(); a.push_back(x);
  39.   for (int i=0;i<b.size();i++) a.push_back(a[i]);
  40. }
  41.  
  42. int target(int curh, int ideal) {
  43.   if (curh < ideal) return ideal - (curh - ideal) + 1;
  44.   else return ideal + (ideal - curh) + 1;
  45. }
  46.  
  47.  
  48.  
  49. int main() {
  50.   #ifndef _DEBUG
  51.   freopen("exam.in", "r", stdin);
  52.   #endif
  53.  
  54.   int T; scanf("%d",&T);
  55.   while (T--) {
  56.     int quares;
  57.     scanf("%d%d",&n,&quares);
  58.     for (int i=0;i<M;i++) a[i].clear();
  59.     memset(dir,0,sizeof(dir));
  60.     memset(h,0,sizeof(h));
  61.  
  62.     for (int i=0;i<=n;i++) {
  63.       h[i] = (M/2) + i;
  64.       a[h[i]].push_back(i);
  65.       dir[i] = LEFT;
  66.     }
  67.  
  68.     bool fail = 0;
  69.     while (quares--) {
  70.       get_quary();
  71.       if (fail) continue;
  72.  
  73.       int if_higher;
  74.       if (h[ver-1] < h[ver]) { // меньшие - выше
  75.         if (variant == REAR) {
  76.           // стыкуем лицевые
  77.           if (dir[ver] == LEFT) if_higher = LEFT;
  78.           else if_higher = RIGHT;
  79.         } else {
  80.           // стыкуем обратные
  81.           if (dir[ver] == LEFT) if_higher = RIGHT;
  82.           else if_higher = LEFT;
  83.         }
  84.       } else {
  85.         // меньшие - ниже
  86.         if (variant == REAR) {
  87.           // стыкуем лицевые
  88.           if (dir[ver] == LEFT) if_higher = LEFT;
  89.           else if_higher = RIGHT;
  90.         } else {
  91.           // стыкуем обратные
  92.           if (dir[ver] == LEFT) if_higher = RIGHT;
  93.           else if_higher = LEFT;
  94.         }
  95.       }
  96.  
  97.       int maxl = -1e9, minl = 1e9;
  98.       for (int i=0;i<ver;i++) {
  99.         maxl = max(maxl,h[i]);
  100.         minl = min(minl,h[i]);
  101.       }
  102.  
  103.       for (int l=minl;l<=maxl;l++)
  104.         if ((l < h[ver] && if_higher == LEFT) || (l >= h[ver] && if_higher == RIGHT)) {
  105.           // Нам надо влево
  106.           bool was_bad = 0;
  107.           for (int i=0;i<a[l].size();i++)
  108.             if (a[l][i] < ver) {
  109.               if (was_bad) {
  110.                 fail = 1;
  111.                 break;
  112.               }
  113.             } else {
  114.               was_bad = 1;
  115.             }
  116.           if (fail) break;
  117.         } else {
  118.           // Нам надо вправо
  119.           bool was_good = 0;
  120.           for (int i=0;i<a[l].size();i++)
  121.             if (a[l][i] >= ver) {
  122.               if (was_good) {
  123.                 fail = 1;
  124.                 break;
  125.               }
  126.             } else {
  127.               was_good = 1;
  128.             }
  129.           if (fail) break;
  130.         }
  131.        
  132.         for (int l=minl;l<=maxl;l++)
  133.         if ((l < h[ver] && if_higher == LEFT) || (l >= h[ver] && if_higher == RIGHT)) {
  134.           // Нам надо влево
  135.           while (a[l].size() > 0 && a[l][0] < ver) {
  136.             W.x = a[l][0]; W.y = target(l,h[ver]); W.z = LEFT;
  137.             need.push_back(W);
  138.             del_first(a[l]);
  139.           }
  140.         } else {
  141.           // Нам надо вправо
  142.           while (a[l].size() > 0 && a[l][((int)a[l].size()) - 1] < ver) {
  143.             W.x =  a[l][((int)a[l].size()) - 1]; W.y = target(l,h[ver]); W.z = RIGHT;
  144.             need.push_back(W);
  145.             a[l].pop_back();
  146.           }
  147.         }
  148.  
  149.         for (int i=0;i<need.size();i++) {
  150.           W = need[i];
  151.           h[W.x] = W.y;
  152.           if (dir[W.x] == LEFT) dir[W.x] = RIGHT;
  153.           else dir[W.x] = LEFT;
  154.           if (W.z == LEFT) {
  155.             add_first(a[W.y],W.x);
  156.           } else a[W.y].push_back(W.x);
  157.         }
  158.     }
  159.    
  160.     if (fail) {  
  161.       puts("SCRUFFY");
  162.       continue;
  163.     }
  164.  
  165.     for (int i=0;i<=n;i++)
  166.       if (dir[i] == LEFT) {
  167.         if (a[h[i]][0] == i) printf("P%dF ",i);
  168.       } else {
  169.         if (a[h[i]][ a[h[i]].size() - 1 ] == i) printf("P%dF ",i);
  170.       }
  171.     for (int i=0;i<=n;i++)
  172.       if (dir[i] != LEFT) {
  173.         if (a[h[i]][0] == i) printf("P%dR ",i);
  174.       } else {
  175.         if (a[h[i]][ a[h[i]].size() - 1 ] == i) printf("P%dR ",i);
  176.       }
  177.     printf("\n");
  178.   }
  179.  
  180.   return 0;
  181. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement