bool check(int D) { SegTree Seg = new SegTree(2 * N); for (int i = 0; i < N; i++) { Seg.Add(Seg.ToLeaf(Q[i]), Seg.ToLeaf(Q[i + N]), true, true); } for (int i = Seg.segf - 1; i >= 0; i--) { int sl = i * 2 + 1; int sr = i * 2 + 2; Seg.Add(i, sl, true, false); Seg.Add(i, sr, true, false); } for (int i = 0; i < 2 * N - 1; i++) { int Pi = P[i] >= N ? Y[P[i] - N] : X[P[i]]; int bf = i; int bl = 2 * N - 1; while (bf != bl) { int bc = (bf + bl + 1) / 2; if (Pi + D > (P[bc] >= N ? Y[P[bc] - N] : X[P[bc]])) { bf = bc; } else { bl = bc - 1; } } if (bl != i) { Seg.Add(i + 1, bl, i); } } TwoSatSolver T = new TwoSatSolver(4 * N - 1, Seg.vs.ToArray(), Seg.us.ToArray(), Seg.vb.ToArray(), Seg.ub.ToArray()); return(T.Answer()); }
void Calc() { string[] str = Console.ReadLine().Split(' '); int N = int.Parse(str[0]) + 1; int Q = int.Parse(str[1]); int A = int.Parse(str[2]); int B = int.Parse(str[3]); str = Console.ReadLine().Split(' '); SegTree SegM = new SegTree(N, this); SegTree SegP = new SegTree(N, this); { int q0 = int.Parse(str[0]); for (int i = 2 * N - 2; i >= 0; i--) { if (i >= SegM.segf) { if (SegM.ToPoint(i) == A) { SegM.X[i] = Math.Max(q0 - B, B - q0) - SegM.ToPoint(i); } else if (SegM.ToPoint(i) == B) { SegM.X[i] = Math.Max(q0 - A, A - q0) - SegM.ToPoint(i); } else { SegM.X[i] = Define.INF; } } else { int sl = i * 2 + 1; int sr = i * 2 + 2; SegM.X[i] = Math.Min(SegM.X[sl], SegM.X[sr]); } } for (int i = 2 * N - 2; i >= 0; i--) { if (i >= SegP.segf) { if (SegP.ToPoint(i) == A) { SegP.X[i] = Math.Max(q0 - B, B - q0) + SegP.ToPoint(i); } else if (SegM.ToPoint(i) == B) { SegP.X[i] = Math.Max(q0 - A, A - q0) + SegP.ToPoint(i); } else { SegP.X[i] = Define.INF; } } else { int sl = i * 2 + 1; int sr = i * 2 + 2; SegP.X[i] = Math.Min(SegP.X[sl], SegP.X[sr]); } } } for (int i = 1; i < Q; i++) { int qb = int.Parse(str[i - 1]); int q = int.Parse(str[i]); long V = Math.Min(SegP.GetMin(q, N - 1) - q, SegM.GetMin(0, q) + q); SegP.AllAdd(Math.Max(qb - q, q - qb)); SegP.Insert(qb, V + qb); SegM.AllAdd(Math.Max(qb - q, q - qb)); SegM.Insert(qb, V - qb); } long count = Define.INF; for (int i = 0; i < N; i++) { count = Math.Min(count, SegP.X[SegP.ToLeaf(i)] - i); } count += SegP.L; sb.Append(count + "\n"); }