首页 > 代码库 > 51Nod 1272最大距离 (树状数组维护前缀最小值)

51Nod 1272最大距离 (树状数组维护前缀最小值)

题目链接 最大距离

其实主流解法应该是单调栈……我用了树状数组。

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 #define rep(i, a, b)    for (int i(a); i <= (b); ++i)
 6 
 7 const int N = 100010;
 8 
 9 struct node{
10     int x, y;
11     friend bool operator < (const node &a, const node &b){
12         return a.x == b.x ? a.y < b.y : a.x < b.x; 
13     }
14         //sort细节,初始ID在前的最后也要在前
15 } a[N];
16 
17 int f[N];
18 int n, ans;
19 
20 void update(int x, int val){
21     for (; x <= n; x += x & -x) f[x] = min(f[x], val);
22 }
23 
24 //树状数组更新
25 
26 int query(int x){
27     int ret = 1 << 30;
28     for (; x; x -= x & -x) ret = min(ret, f[x]);
29     return ret;
30 }
31 
32 //树状数组查询前缀最小值
33 
34 int main(){
35 
36     scanf("%d", &n);
37     rep(i, 1, n){
38         scanf("%d", &a[i].x);
39         a[i].y = i;
40     }
41 
42     sort(a + 1, a + n + 1);
43     rep(i, 0, n + 100) f[i] = 1 << 30; //Init...
44 
45     ans = -1;
46     rep(i, 1, n){
47         update(a[i].y, a[i].y);
48         int cnt = query(a[i].y);
49         ans = max(ans, a[i].y - cnt);
50     }
51     printf("%d\n", ans);
52     return 0;
53 }

 

51Nod 1272最大距离 (树状数组维护前缀最小值)