Advertisement
aropan

2011-10-22 coci [CONTEST #1]. SKAKAC

Oct 22nd, 2011
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.55 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cmath>
  3. #include <algorithm>
  4. #include <bitset>
  5. #include <vector>
  6.  
  7. using namespace std;
  8.  
  9. #define X first
  10. #define Y second
  11.  
  12.  
  13.  
  14. const int MAXN = 32;
  15. const int MAXT = 1000001;
  16. const int MAXK = MAXN * MAXN;
  17. const int MAXP = 20;
  18.  
  19. bitset <MAXN> a[MAXN], b[MAXN];
  20. bitset <MAXN> one[MAXN], two[MAXN];
  21. bitset <MAXN> mask[MAXP][MAXN];
  22. int x[MAXK], y[MAXK], d[MAXK];
  23. int next[MAXK];
  24. int last[MAXT];
  25. int n, T, k, X, Y;
  26. vector < pair <int, int> > ans;
  27.  
  28. int add(int t, int i)
  29. {
  30.     if (t > T) return 0;
  31.     next[i] = last[t];
  32.     last[t] = i;
  33.     return 0;
  34. }
  35.  
  36. int main()
  37. {
  38. //*
  39.     freopen("in", "r", stdin);
  40.     freopen("out", "w", stdout);
  41. //*/
  42.     scanf("%d %d %d %d", &n, &T, &X, &Y);
  43.     X--, Y--;
  44.     a[X].set(Y);
  45.  
  46.     for (int i = 0; i < n; i++)
  47.         for (int j = 0; j < n; j++)
  48.         {
  49.             int v;
  50.             scanf("%d", &v);
  51.  
  52.             if (v < 3)
  53.             {
  54.                 mask[1][i].set(j, (v == 1) || (v == 2) && ((i + j) & 1) == ((X + Y) & 1));
  55.                 continue;
  56.             }
  57.  
  58.             if (v < MAXP)
  59.             {
  60.                 mask[v][i].set(j, 1);
  61.                 continue;
  62.             }
  63.  
  64.             k++;
  65.             x[k] = i;
  66.             y[k] = j;
  67.             d[k] = v;
  68.             add(v, k);
  69.         }
  70.  
  71.     for (int t = 1; t <= T; t++)
  72.     {
  73.         for (int i = 0; i < n; i++)
  74.         {
  75.             one[i] = (a[i] >> 1) | (a[i] << 1);
  76.             two[i] = (a[i] >> 2) | (a[i] << 2);
  77.         }
  78.  
  79.         for (int i = 0; i < n; i++)
  80.         {
  81.             b[i].reset();
  82.             if (1 < i) b[i] |= one[i - 2];
  83.             if (0 < i) b[i] |= two[i - 1];
  84.             if (i < n - 1) b[i] |= two[i + 1];
  85.             if (i < n - 2) b[i] |= one[i + 2];
  86.         }
  87.  
  88.  
  89.         for (int i = 0; i < n; i++)
  90.             a[i].reset();
  91.  
  92.         for (int i = 1; i < MAXP; i++)
  93.             if (t % i == 0)
  94.                 for (int j = 0; j < n; j++)
  95.                     a[j] |= b[j] & mask[i][j];
  96.  
  97.         for (int i = last[t], j; i; i = j)
  98.         {
  99.             a[x[i]].set(y[i], b[x[i]].test(y[i]));
  100.             j = next[i];
  101.             add(t + d[i], i);
  102.         }
  103.     }
  104.  
  105.     for (int i = 0; i < n; i++)
  106.         for (int j = 0; j < n; j++)
  107.             if (a[i].test(j))
  108.                 ans.push_back(make_pair(i + 1, j + 1));
  109.  
  110.     printf("%d\n", ans.size());
  111.     for (int i = 0; i < ans.size(); i++)
  112.         printf("%d %d\n", ans[i].X, ans[i].Y);
  113.  
  114. //    fprintf(stderr, "Time of execution: %.3lf sec.\n", (double)clock()/CLOCKS_PER_SEC);
  115.     return 0;
  116. }
  117.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement