一、题目

  Sticks Problem

二、分析

  对于$i$和$j$,并没有很好的方法能同时将他们两找到最优值,所以考虑固定左端点$i$。

  固定左端点后,根据题意,$a[i]$是最小值,那么现在的问题就转化成了求以$a[i]$为左端点最小值的范围内,找到一个最大值$a[j]$的$j$,然后相减就是以$i$为左端点的最优值。

  然后枚举$i$,找到最大的$j-i$即可。

  如何找$j$,预先用ST表预处理好最大值最小值,然后先找以$i$为最小值的管辖范围(二分找,因为如果当前位置$pos$如果不满足,那么$j$肯定在$pos$的左边,反之可能在右边),再用ST表在这个范围内找到最大的$j$即可。

三、AC代码

 1 #include <cstdio>
2 #include <cstring>
3 #include <iostream>
4 #include <algorithm>
5 #include <vector>
6 #include <cmath>
7
8 using namespace std;
9 #define ll long long
10 #define Min(a,b) ((a)>(b)?(b):(a))
11 #define Max(a,b) ((a)>(b)?(a):(b))
12 const int MAXN = 5e4 + 13;
13 int N, a[MAXN], STmax[MAXN][30], STmin[MAXN][30];
14 int Logn[MAXN];
15
16 void pre_log()
17 {
18 Logn[1] = 0, Logn[2] = 1;
19 for(int i = 3; i <= MAXN; i++) {
20 Logn[i] = Logn[i/2] + 1;
21 }
22 }
23
24 void pre_st()
25 {
26 for(int i = 1; i <= N; i++) STmax[i][0] = i, STmin[i][0] = i;
27 int k = Logn[N];
28 for(int j = 1; j <= k; j++) {
29 for(int i = 1; i + (1<<j) - 1 <= N; i++) {
30 if(a[STmin[i][j-1]] < a[STmin[i+(1<<(j-1))][j-1]]) STmin[i][j] = STmin[i][j-1];
31 else STmin[i][j] = STmin[i+(1<<(j-1))][j-1];
32 if(a[STmax[i][j-1]] > a[STmax[i+(1<<(j-1))][j-1]]) STmax[i][j] = STmax[i][j-1];
33 else STmax[i][j] = STmax[i+(1<<(j-1))][j-1];
34 }
35 }
36 }
37
38 int query_min(int l, int r)
39 {
40 // int k = log(1.0*(r - l + 1))/log(2.0);
41 int k = Logn[r - l + 1];
42 if(a[STmin[l][k]] > a[STmin[r-(1<<k)+1][k]]) return STmin[r-(1<<k)+1][k];
43 else return STmin[l][k];
44 }
45
46 int query_max(int l, int r)
47 {
48 int k = log(1.0*(r - l + 1))/log(2.0);
49 if(a[STmax[l][k]] < a[STmax[r-(1<<k)+1][k]]) return STmax[r-(1<<k)+1][k];
50 else return STmax[l][k];
51 }
52
53 int query(int l, int r)
54 {
55 int p = l;
56 while(l < r) {
57 int mid = (l+r+1)>>1;
58 if(query_min(p, mid) == p) l = mid;
59 else r = mid-1;
60 }
61 return l;
62 }
63
64 int main()
65 {
66 pre_log();
67 while(scanf("%d", &N) != EOF) {
68 for(int i = 1; i <= N; i++) {
69 scanf("%d", &a[i]);
70 }
71 pre_st();
72 int ans = -1;
73 for(int i = 1; i < N; i++) {
74 //先以i为最小值进行查找最大的管辖范围
75 //再求范围内的最大j
76 int j = query_max(i, query(i, N));
77 if(j - i == 0)
78 continue;
79 else
80 ans = Max(ans, j - i);
81 }
82 printf("%d\n", ans);
83 }
84 return 0;
85 }

POJ_2452 Sticks Problem 【ST表 + 二分】的更多相关文章

  1. 「ZJOI2018」胖(ST表+二分)

    「ZJOI2018」胖(ST表+二分) 不开 \(O_2\) 又没卡过去是种怎么体验... 这可能是 \(ZJOI2018\) 最简单的一题了...我都能 \(A\)... 首先我们发现这个奇怪的图每 ...

  2. GCD(st表+二分)

    GCD Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submis ...

  3. 2019CCPC网络赛 C - K-th occurrence HDU - 6704(后缀数组+ST表+二分+主席树)

    题意 求区间l,r的子串在原串中第k次出现的位置. 链接:https://vjudge.net/contest/322094#problem/C 思路 比赛的时候用后缀自动机写的,TLE到比赛结束. ...

  4. 【BZOJ-4310】跳蚤 后缀数组 + ST表 + 二分

    4310: 跳蚤 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 180  Solved: 83[Submit][Status][Discuss] De ...

  5. BZOJ4556 [Tjoi2016&Heoi2016]字符串 SA ST表 二分答案 主席树

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ4556.html 题目传送门 - BZOJ4556 题意 给定一个长度为 $n$ 的字符串 $s$ . ...

  6. hdu5289 ST表+二分

    用裸的St表+暴力枚举查询时稳TLE的,可以枚举每个区间的起点+二分满足条件的区间右端,这样复杂度是O(nlogn) #include<iostream> #include<cstr ...

  7. luoguP5108 仰望半月的夜空 [官方?]题解 后缀数组 / 后缀树 / 后缀自动机 + 线段树 / st表 + 二分

    仰望半月的夜空 题解 可以的话,支持一下原作吧... 这道题数据很弱..... 因此各种乱搞估计都是能过的.... 算法一 暴力长度然后判断判断,复杂度\(O(n^3)\) 期望得分15分 算法二 通 ...

  8. 2016多校联合训练1 D题GCD (ST表+二分)

    暑假颓废了好久啊...重新开始写博客 题目大意:给定10w个数,10w个询问.每次询问一个区间[l,r],求出gcd(a[l],a[l+1],...,a[r])以及有多少个区间[l',r']满足gcd ...

  9. 洛谷P4501/loj#2529 [ZJOI2018]胖(ST表+二分)

    题面 传送门(loj) 传送门(洛谷) 题解 我们对于每一个与宫殿相连的点,分别计算它会作为多少个点的最短路的起点 若该点为\(u\),对于某个点\(p\)来说,如果\(d=|p-u|\),且在\([ ...

随机推荐

  1. 设计模式(二十二)——状态模式(APP抽奖活动+借贷平台源码剖析)

    24.1 APP 抽奖活动问题 请编写程序完成 APP 抽奖活动 具体要求如下: 1) 假如每参加一次这个活动要扣除用户 50 积分,中奖概率是 10% 2) 奖品数量固定,抽完就不能抽奖 3) 活动 ...

  2. Hive Tutorial 阅读记录

    Hive Tutorial 目录 Hive Tutorial 1.Concepts 1.1.What Is Hive 1.2.What Hive Is NOT 1.3.Getting Started ...

  3. Semantic Pull Requests All In One

    Semantic Pull Requests All In One https://github.com/zeke/semantic-pull-requests docs: Update direct ...

  4. how to auto open demo and create it in a new codesandbox

    how to auto open demo and create it in a new codesandbox markdown & iframe https://ant.design/do ...

  5. Winter Bash & Stack Overflow

    Winter Bash & Stack Overflow https://stackoverflow.com/users/5934465/xgqfrms#winter-bash https:/ ...

  6. no need jQuery anymore & You don't need jQuery anymore!

    no need jQuery anymore & You don't need jQuery anymore! "use strict"; /** * * @author ...

  7. css & input type & search icon

    css & input type & search icon bug type="search" <input @input="autoSearch ...

  8. js 在浏览器中使用 monaco editor

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  9. NGK生态商城即将上线官网,推动生态落地应用

    NGK生态商城即将上线官网,以推动生态落地应用.此举意味着NGK生态将跻身区块链顶尖之列,同时,NGK代币.NGK Dapp游戏 "呼叫河马" 以及NGK DeFi项目Baccar ...

  10. 「NGK每日快讯」12.17日NGK第44期官方快讯!