题目链接:Codeforces 487B Strip
复制代码
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65#include <cstdio> #include <cstring> #include <stack> #include <vector> #include <algorithm> using namespace std; const int maxn = 1e5 + 5; const int maxr = 20; const int inf = 0x3f3f3f3f; int ca, cd, AS[maxn], DS[maxn]; int N, S, L, Db[maxn][maxr], Ds[maxn][maxr], dp[maxn]; vector<int> Arr; void init(const vector<int>& arr) { int n = arr.size(); for (int i = 1; i < n; i++) Db[i][0] = Ds[i][0] = arr[i]; for (int j = 1; (1<<j) <= n; j++) { for (int i = 0; i + (1<<j) - 1 < n; i++) { Ds[i][j] = min(Ds[i][j-1], Ds[i+(1<<(j-1))][j-1]); Db[i][j] = max(Db[i][j-1], Db[i+(1<<(j-1))][j-1]); } } } int query(int l, int r) { int k = 0; while ((1<<(k+1)) <= r - l + 1) k++; return max(Db[l][k], Db[r-(1<<k)+1][k]) - min(Ds[l][k], Ds[r-(1<<k)+1][k]); } void solve() { memset(dp, inf, sizeof(dp)); int mv = dp[0] = 0; for (int i = L; i <= N; i++) { while (i - mv >= L && (query(mv + 1, i) > S || dp[mv] == inf)) mv++; if (i - mv >= L) dp[i] = min(dp[i], dp[mv] + 1); // printf("%dn", dp[i]); } if (dp[N] == inf) dp[N] = -1; printf("%dn", dp[N]); } int main () { int x; scanf("%d%d%d", &N, &S, &L); Arr.push_back(0); for (int i = 0; i < N; i++) { scanf("%d", &x); Arr.push_back(x); } init(Arr); solve(); return 0; }
最后
以上就是仁爱奇异果最近收集整理的关于Codeforces 487B Strip(RMQ)的全部内容,更多相关Codeforces内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复