http://www.lightoj.com/volume_showproblem.php?problem=1093
Test Instructions: for a given sequence, ask the maximum number of intervals with a length of D and the minimum worth of the difference.
idea: You can use a line tree to do that, because of the fixed interval length, you can also use a monotone queue.
/** @Date: 2016-12-06-18.39 * @Author: Lweleth ([email protected]) * @Link: https://github.com/* @Versi On: */#include <bits/stdc++.h> #define LL long long#define PII pair#define MP (x, y) Make_pair ((x), (y)) #define FI fir St#define se second#define PB (x) push_back ((x)) #define MMG (x) memset ((x), -1,sizeof (x)) #define MMF (x) memset ((x), 0, sizeof (x)) #define MMI (x) memset ((x), INF, sizeof (x)) using namespace Std;const int INF = 0x3f3f3f3f;const int N = 1e5+20;co NST double EPS = 1e-8;struct yuu{int L, R; int Ma; int mi;} Tt[n << 2];int a[n];void pushup (int p) {tt[p].ma = max (tt[p << 1].ma, tt[p << 1 | 1].ma); TT[P].MI = min (tt[p << 1].mi, tt[p << 1 | 1].mi);} void build (int l, int r, int p) {tt[p].l = l; TT[P].R = R; tt[p].ma = 0; TT[P].MI = INF; if (L = = r) {tt[p].ma = TT[P].MI = A[l]; return; } int mid = (L + r) >> 1; Build (L, Mid, p << 1); Build (mid + 1, R, p <<1 | 1); Pushup (P);} void Updata (int l, int r, int v, int p) {if (L <= tt[p].l && R >= tt[p].r) {return; } int mid = (tt[p].l + tt[p].r) >> 1; if (l <= mid) Updata (L, R, V, p << 1); if (R > Mid) Updata (L, R, V, p << 1 | 1); Pushup (P);} PII query (int l, int r, int p)//Direct return pair will time out {//cout <<tt[p].ma << "~" <<tt[p].mi << Endl; if (l <= tt[p].l && R >= TT[P].R) return MP (tt[p].ma, TT[P].MI); int mid = (TT[P].L + tt[p]. R) >> 1; PII ans; ans.fi = 0; ans.se = INF; if (l <= mid) {ans.fi = max (ans.fi, query (L, R, p << 1). Fi); ans.se = min (ans.se, query (L, R, p << 1). SE); } if (R > mid) {ans.fi = max (ans.fi, query (L, R, p << 1 | 1). FI); ans.se = min (ans.se, query (L, R, p << 1 | 1). SE); } return ans; int queryma (int l, int r, int p) {if (L <= tt[p].l && R >=TT[P].R) return tt[p].ma; int mid = (tt[p].l + tt[p].r) >> 1; int ma = 0; if (l <= mid) Ma = Max (MA, Queryma (L, R, p << 1)); if (R > Mid) ma = Max (MA, Queryma (L, R, p << 1 | 1)); Return MA;} int Querymi (int l, int r, int p) {if (L <= tt[p].l && R >= TT[P].R) return TT[P].MI; int mid = (tt[p].l + tt[p].r) >> 1; int mi = INF; if (L <= mid) mi = min (mi, Querymi (l, R, p << 1)); if (R > Mid) mi = min (mi, Querymi (l, R, p << 1 | 1)); return mi;} int main () {int T; int cnt = 0; Cin >> T; while (t--) {int n, D; scanf ("%d%d", &n, &d); for (int i = 1; I <= n; i++) {scanf ("%d", A + i); } build (1, N, 1); cout << Query (2, 3, 1) << Endl; int ma = 0; for (int i = 1; i + d-1 <= N; i++) {//pii x = query (i, i + d-1, 1); Ma= Max (Queryma (i, i + d-1, 1)-Querymi (i, i + d-1, 1), MA); cout << Ma <<endl; } printf ("Case%d:%d\n", ++cnt, MA); } return 0;}
Lightoj 1093-ghajini Segment Tree