一、题目

  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. leetcode 周赛 205 1576-5508-5509-5510

    第四题比较难,看题解用并查集做比较简单,但是我觉得难度在想到用并查集,可能是最近做题少所以想不到吧. 1 替换所有的问号 class Solution { public: string modifyS ...

  2. JS编程练习:将目标节点内部的子节点逆序

    将目标节点内部的子节点逆序 1 <body> 2 <div> 3 <p></p> 4 <span></span> 5 <e ...

  3. HDU 6611 K Subsequence(Dijkstra优化费用流 模板)题解

    题意: 有\(n\)个数\(a_1\cdots a_n\),现要你给出\(k\)个不相交的非降子序列,使得和最大. 思路: 费用流建图,每个点拆点,费用为\(-a[i]\),然后和源点连边,和后面非降 ...

  4. 2021-2-17:Java HashMap 的中 key 的哈希值是如何计算的,为何这么计算?

    首先,我们知道 HashMap 的底层实现是开放地址法 + 链地址法的方式来实现. 即数组 + 链表的实现方式,通过计算哈希值,找到数组对应的位置,如果已存在元素,就加到这个位置的链表上.在 Java ...

  5. LVS之DR模式部署

    一.LVS-DR数据包流向分析 为方便进行原理分析,将Client与群集机器放在同一网络中,数据包流经的路线为1-2-3-41.Client 向目标 VIP 发出请求,Director(负载均衡器)接 ...

  6. Apple WWDC All In One

    Apple WWDC All In One https://developer.apple.com/wwdc20/ https://developer.apple.com/videos/wwdc202 ...

  7. JSON-LD & SEO

    JSON-LD & SEO https://json-ld.org/ https://en.wikipedia.org/wiki/JSON-LD Google Search structure ...

  8. macOS & PostgreSQL

    macOS & PostgreSQL macOS 上安装 PostgreSQL 后为什么会自动创建一个系统用户账号 https://get.enterprisedb.com/postgresq ...

  9. leetcode solution cracked tutorial

    leetcode solution cracked tutorial problemset https://leetcode.com/problemset/all/ Top Interview Que ...

  10. AMP & PWA

    AMP & PWA AMP is a web component framework to easily create user-first websites. stories. ads. e ...