Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- const int inf = 1000000000;
- struct Q
- {
- int a[4];
- int& operator[](int x)
- {
- return a[x];
- }
- const int& operator[](int x) const
- {
- return a[x];
- }
- };
- void printQ(const Q &x)
- {
- printf("%d %d %d %d\n", x[0], x[1], x[2], x[3]);
- }
- Q getElem();
- inline Q primitive()
- {
- Q result;
- result[0] = inf;
- result[1] = 0;
- result[2] = 0;
- result[3] = 0;
- return result;
- }
- inline Q infQ()
- {
- Q result;
- for (int i = 0; i < 4; ++i)
- result[i] = inf;
- return result;
- }
- inline int nonZero(int x)
- {
- //printf("nonZero(%d)\n", x);
- if (x == 0)
- return 0;
- else
- return 1;
- }
- int _inCost[4] = {0, 1, 1, 2};
- inline int inCost(int x)
- {
- return _inCost[x];
- }
- inline Q series(int n)
- {
- Q result = getElem();
- for (int i = 1; i < n; ++i)
- {
- Q next = getElem();
- Q newResult = infQ();
- for (int last = 0; last < 4; ++last)
- {
- for (int cur = 0; cur < 4; ++cur)
- {
- int newConfig = (last & 1) + (cur & 2);
- int connection = nonZero((last & 2) + (cur & 1));
- //printf("%d %d: %d %d :%d\n", last, cur, last & 2, cur & 1, connection);
- int cost = result[last] + next[cur] + connection;
- if (cost < newResult[newConfig])
- newResult[newConfig] = cost;
- }
- }
- result = newResult;
- }
- return result;
- }
- inline Q parallel(int n)
- {
- Q pseudoResult = getElem();
- for (int i = 0; i < 4; ++i)
- pseudoResult[i] += inCost(i);
- for (int i = 1; i < n; ++i)
- {
- Q next = getElem();
- Q newPseudoResult = infQ();
- for (int last = 0; last < 4; ++last)
- {
- for (int cur = 0; cur < 4; ++cur)
- {
- int newConfig = last | cur;
- int connection = inCost(cur);
- int cost = pseudoResult[last] + next[cur] + connection;
- //printf("%d %d: %d %d %d\n", last, cur, newConfig, connection, cost);
- if (cost < newPseudoResult[newConfig])
- newPseudoResult[newConfig] = cost;
- }
- }
- pseudoResult = newPseudoResult;
- }
- Q result;
- for (int i = 0; i < 4; ++i)
- {
- result[i] = pseudoResult[i ^ 3];
- }
- return result;
- }
- inline Q getElem()
- {
- char tmp[2];
- scanf("%s", tmp);
- if (tmp[0] == 'X')
- return primitive();
- else
- {
- int n;
- scanf("%d", &n);
- if (tmp[0] == 'R')
- return parallel(n);
- else
- return series(n);
- }
- }
- int main()
- {
- Q result = getElem();
- //printQ(result);
- int best = inf;
- for (int i = 0; i < 4; ++i)
- {
- int need = inCost(i);
- int cost = result[i] + need;
- //printf("%d: %d\n", i, cost);
- if (cost < best)
- best = cost;
- }
- printf("%d\n", best);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement