Luogu P2495 [SDOI2011]消耗战
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| inline bool cmp(int a, int b) { return nddfs[a] < nddfs[b]; } int cntkey, key[MAXn + 10]; int cntuse, use[MAXn + 10]; int top, stk[MAXn + 10]; void InitAdj() { while (cntuse) { l2.head[use[cntuse--]] = 0; } l2.cntnex = 0; } void EvaVirTree() { InitAdj(); sort(key + 1, key + 1 + cntkey, cmp); stk[++top] = 1; use[++cntuse] = 1; for (int i = 1; i <= cntkey; ++i) { int lca = Lca(key[i], stk[top]); for (int j = top; j; --j) { if (nddfs[stk[j]] <= nddfs[lca]) { for (; top > j + 1; --top) { Insert(stk[top - 1], stk[top]); } if (top == j + 1) { Insert(lca, stk[top]); --top; } if (stk[j] != lca) { stk[++top] = lca; use[++cntuse] = lca; } stk[++top] = key[i]; use[++cntuse] = key[i]; break; } } } for (; top > 1; --top) { Insert(stk[top - 1], stk[top]); } --top; }
|