0%

P2880 [USACO07JAN] Balanced Lineup G

思路讲解

来学习一下ST表(sparse table 稀疏表)

算了,我发现树状数组也不是不行,哈哈,我还是用我熟悉的树状数组

https://www.cnblogs.com/qdscwyy/p/9759220.html

我们来解释一些代码吧

1
2
3
4
// 1个大区间想要遍历下面的小区间需要这么写
for(int i=1;i<low;i<<=1){
trd[x]=max(trd[x-i],trd[x]);
}

为什么需要这么写?

8二进制100维护区间8lowbit(8)88\xrightarrow{二进制}100\xrightarrow{维护区间}8-lowbit(8)~8

lowbit(8)=23=2二进制中第一个1在第几位lowbit(8)=2^3=2^{二进制中第一个1在第几位}

AC代码

AC

https://www.luogu.com.cn/record/199551454

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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <deque>
#include <queue>
#include <vector>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <cmath>
#include <bitset>
#include <iterator>
#include <random>
#include <iomanip>
#include <cctype>
#include <array>
#define FOR(i, a, b) for (int i = a; i <= b; ++i)
#define ROF(i, a, b) for (int i = b; i >= a; --i)

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll,ll> pll;
typedef array<ll,3> arr;
const ll MAXN=static_cast<ll>(5e4)+10;

ll N,T,H[MAXN],trx[MAXN],trd[MAXN];
inline ll lowbit(ll x){
return x&(-x);
}
inline void updx(ll x,ll k){ // 更新小数数组
// 将x位置替换为k
while (x<=N) {
trx[x]=k;
ll low=lowbit(x);
// 1个大区间想要遍历下面的小区间需要这么写
for(int i=1;i<low;i<<=1){
trx[x]=min(trx[x-i],trx[x]);
}
x+=lowbit(x);
}
}
inline void updd(ll x,ll k){ // 更新大数数组
// 将x位置替换为k
while (x<=N) {
trd[x]=k;
ll low=lowbit(x);
// 1个大区间想要遍历下面的小区间需要这么写
for(int i=1;i<low;i<<=1){
trd[x]=max(trd[x-i],trd[x]);
}
x+=lowbit(x);
}
}
inline ll queryx(ll a,ll b){
ll res=1e18;
while (b>=a) {
res=min(H[b],res);
b-=1;
for(;b-lowbit(b)>=a;b-=lowbit(b)){
res=min(trx[b],res);
}
}
return res;
}
inline ll queryd(ll a,ll b){
ll res=0;
while (b>=a) {
res=max(H[b],res);
b-=1;
for(;b-lowbit(b)>=a;b-=lowbit(b)){
res=max(trd[b],res);
}
}
return res;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>N>>T;
FOR(i, 1, N){
cin>>H[i];
}
memset(trx, 0x3f, sizeof(trx));
FOR(i, 1, N){
updd(i, H[i]);
updx(i, H[i]);
}
while (T--) {
ll l,r;
cin>>l>>r;
cout<<queryd(l, r)-queryx(l, r)<<'\n';
}
return 0;
}
/*
6 3
1
7
3
4
2
5
1 5
4 6
2 2
AC https://www.luogu.com.cn/record/199551454
*/

心路历程(WA,TLE,MLE……)