sicily--1934. 移动小球

来源:互联网 发布:站长交易第一平台源码 编辑:程序博客网 时间:2024/04/26 05:45

转自:http://adonis0147.blog.163.com/blog/static/162553854201061410316118/

一开始用链表操作,但是操作太多,且没有办法直接找到相应的下标,所以上网看看大牛的解法,这个解法自己觉得很不错了,所以贴出来

#include <iostream>#include <cstdio>using namespace std;int prev[501000];int next[501000];int main(){    int t, n, m;    int q, a, b;    int counter, s;        scanf("%d", &t);        while (t --)    {         scanf("%d%d", &n, &m);                  for (int i = 1; i <= n + 1; i ++)         {              next[i - 1] = i;              prev[i] = i - 1;         }                  while (m --)         {              scanf("%d%d%d", &q, &a, &b);                            if (q == 1)              {                   next[prev[a]] = next[a];                   prev[next[a]] = prev[a];                                      next[prev[b]] = a;                   prev[a] = prev[b];                                      next[a] = b;                   prev[b] = a;              }                            else                           //这里之前我写的是 if (q == 2) 结果得到了 N 次 WA,感觉数据貌似有问题              {                   next[prev[a]] = next[a];                   prev[next[a]] = prev[a];                                      next[a] = next[b];                   prev[next[b]] = a;                                      next[b] = a;                   prev[a] = b;              }         }                  counter = 1;         s = next[0];                  while (counter <= n)         {              printf("%d ", s);                            s = next[s];              counter ++;         }                  printf("\n");    }        return 0;}


原创粉丝点击