题解 CF1119A 【Ilya and a Colorful Walk】

皎月半洒花

2019-05-21 17:59:36

Solution

好的我是来搞笑的。 众所周知这是一道O(n)好题,但是数据结构学傻了就只会O(nlogn)了。 然后就是线段树贪心 ```cpp #include <cstdio> #include <cstring> #include <iostream> #define MAXN 500010 #define Inf 0x3f3f3f using namespace std ; int Ans = 0 ; int N, S[MAXN << 2], T[MAXN << 2], base[MAXN], Pre[MAXN], End[MAXN] ; inline void update1(int rt, int l, int r, int pos, int k){ if (l == pos && r == pos) { S[rt] = k ; return ; } int mid = (l + r) >> 1 ; if (pos <= mid) update1(rt << 1, l, mid, pos, k) ; else update1(rt << 1 | 1, mid + 1, r, pos, k) ; S[rt] = min(S[rt << 1], S[rt << 1 | 1]) ; } inline void update2(int rt, int l, int r, int pos, int k){ if (l == pos && r == pos) { T[rt] = k ; return ; } int mid = (l + r) >> 1 ; if (pos <= mid) update2(rt << 1, l, mid, pos, k) ; else update2(rt << 1 | 1, mid + 1, r, pos, k) ; T[rt] = max(T[rt << 1], T[rt << 1 | 1]) ; } inline int query1(int rt, int l, int r, int ql, int qr){ if (ql > qr) return Inf ; if (ql <= l && qr >= r) return S[rt] ; int res = Inf, mid = (l + r) >> 1 ; if (ql <= mid) res = min(res, query1(rt << 1, l, mid, ql, qr)) ; if (qr > mid) res = min(res, query1(rt << 1 | 1, mid + 1, r, ql, qr)) ; return res ; } inline int query2(int rt, int l, int r, int ql, int qr){ if (ql > qr) return 0 ; if (ql <= l && qr >= r) return T[rt] ; int res = -1, mid = (l + r) >> 1 ; if (ql <= mid) res = max(res, query2(rt << 1, l, mid, ql, qr)) ; if (qr > mid) res = max(res, query2(rt << 1 | 1, mid + 1, r, ql, qr)) ; return res ; } int main(){ cin >> N ; int i ; memset(S, 63, sizeof(S)) ; memset(Pre, 63, sizeof(Pre)) ; memset(End, -1, sizeof(End)) ; for (i = 1 ; i <= N ; ++ i) scanf("%d", &base[i]) ; for (i = 1 ; i <= N ; ++ i) if (Pre[base[i]] > i) Pre[base[i]] = i ; for (i = N ; i >= 1 ; -- i) if (End[base[i]] < i) End[base[i]] = i ; for (i = 1 ; i <= N ; ++ i) update1(1, 1, N, i, Pre[i]) ; for (i = 1 ; i <= N ; ++ i) update2(1, 1, N, i, End[i]) ; for (i = 1 ; i <= N ; ++ i){ int t1 = min(query1(1, 1, N, 1, base[i] - 1), query1(1, 1, N, base[i] + 1, N)) ; int t2 = max(query2(1, 1, N, 1, base[i] - 1), query2(1, 1, N, base[i] + 1, N)) ; Ans = max(Ans, max(i - t1, t2 - i)) ; } cout << Ans << endl ; return 0 ; } ```