Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <vector>
- #include <string.h>
- #include <memory.h>
- using namespace std;
- #define N 32
- #define M 5222
- #define FRONT 1
- #define REAR 2
- #define LEFT 0
- #define RIGHT 1
- int dir[N],h[N];
- vector<int> a[M],toleft[M],toright[M];
- int ver,variant,n;
- struct cell {
- int x,y,z;
- } W;
- vector<cell> need;
- void get_quary() {
- char b[5]; scanf("%s",b);
- int len = strlen(b);
- if (b[n-1] == 'F') variant = FRONT;
- else variant = REAR;
- if (n == 2) ver = b[0]-'0';
- else ver = (b[0]-'0')*10 + (b[1]-'0');
- }
- void del_first(vector<int>& a) {
- for (int i=0;i+1<a.size();i++) a[i+1] = a[i];
- a.pop_back();
- }
- void add_first(vector<int>& a, int x) {
- vector<int> b = a;
- a.clear(); a.push_back(x);
- for (int i=0;i<b.size();i++) a.push_back(a[i]);
- }
- int target(int curh, int ideal) {
- if (curh < ideal) return ideal - (curh - ideal) + 1;
- else return ideal + (ideal - curh) + 1;
- }
- int main() {
- #ifndef _DEBUG
- freopen("exam.in", "r", stdin);
- #endif
- int T; scanf("%d",&T);
- while (T--) {
- int quares;
- scanf("%d%d",&n,&quares);
- for (int i=0;i<M;i++) a[i].clear();
- memset(dir,0,sizeof(dir));
- memset(h,0,sizeof(h));
- for (int i=0;i<=n;i++) {
- h[i] = (M/2) + i;
- a[h[i]].push_back(i);
- dir[i] = LEFT;
- }
- bool fail = 0;
- while (quares--) {
- get_quary();
- if (fail) continue;
- int if_higher;
- if (h[ver-1] < h[ver]) { // меньшие - выше
- if (variant == REAR) {
- // стыкуем лицевые
- if (dir[ver] == LEFT) if_higher = LEFT;
- else if_higher = RIGHT;
- } else {
- // стыкуем обратные
- if (dir[ver] == LEFT) if_higher = RIGHT;
- else if_higher = LEFT;
- }
- } else {
- // меньшие - ниже
- if (variant == REAR) {
- // стыкуем лицевые
- if (dir[ver] == LEFT) if_higher = LEFT;
- else if_higher = RIGHT;
- } else {
- // стыкуем обратные
- if (dir[ver] == LEFT) if_higher = RIGHT;
- else if_higher = LEFT;
- }
- }
- int maxl = -1e9, minl = 1e9;
- for (int i=0;i<ver;i++) {
- maxl = max(maxl,h[i]);
- minl = min(minl,h[i]);
- }
- for (int l=minl;l<=maxl;l++)
- if ((l < h[ver] && if_higher == LEFT) || (l >= h[ver] && if_higher == RIGHT)) {
- // Нам надо влево
- bool was_bad = 0;
- for (int i=0;i<a[l].size();i++)
- if (a[l][i] < ver) {
- if (was_bad) {
- fail = 1;
- break;
- }
- } else {
- was_bad = 1;
- }
- if (fail) break;
- } else {
- // Нам надо вправо
- bool was_good = 0;
- for (int i=0;i<a[l].size();i++)
- if (a[l][i] >= ver) {
- if (was_good) {
- fail = 1;
- break;
- }
- } else {
- was_good = 1;
- }
- if (fail) break;
- }
- for (int l=minl;l<=maxl;l++)
- if ((l < h[ver] && if_higher == LEFT) || (l >= h[ver] && if_higher == RIGHT)) {
- // Нам надо влево
- while (a[l].size() > 0 && a[l][0] < ver) {
- W.x = a[l][0]; W.y = target(l,h[ver]); W.z = LEFT;
- need.push_back(W);
- del_first(a[l]);
- }
- } else {
- // Нам надо вправо
- while (a[l].size() > 0 && a[l][((int)a[l].size()) - 1] < ver) {
- W.x = a[l][((int)a[l].size()) - 1]; W.y = target(l,h[ver]); W.z = RIGHT;
- need.push_back(W);
- a[l].pop_back();
- }
- }
- for (int i=0;i<need.size();i++) {
- W = need[i];
- h[W.x] = W.y;
- if (dir[W.x] == LEFT) dir[W.x] = RIGHT;
- else dir[W.x] = LEFT;
- if (W.z == LEFT) {
- add_first(a[W.y],W.x);
- } else a[W.y].push_back(W.x);
- }
- }
- if (fail) {
- puts("SCRUFFY");
- continue;
- }
- for (int i=0;i<=n;i++)
- if (dir[i] == LEFT) {
- if (a[h[i]][0] == i) printf("P%dF ",i);
- } else {
- if (a[h[i]][ a[h[i]].size() - 1 ] == i) printf("P%dF ",i);
- }
- for (int i=0;i<=n;i++)
- if (dir[i] != LEFT) {
- if (a[h[i]][0] == i) printf("P%dR ",i);
- } else {
- if (a[h[i]][ a[h[i]].size() - 1 ] == i) printf("P%dR ",i);
- }
- printf("\n");
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement