一、题目

  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. ElasticSearch 7.x 学习

    目录 ElasticSearch 7.x 一.前言 1.1.正向索引和倒排索引 1.1.1.正向索引 1.1.2.倒排索引 二.安装 三.ES 基本概念 3.1.索引 3.2.文档 3.4.mappi ...

  2. Win10永久禁用驱动程序强制签名

    在win10下用一个命令就可以禁用驱动程序强制签名 1.禁止强制签名,以管理员的身份运行cmd 执行以下命令 bcdedit.exe /set nointegritychecks on 恢复默认验证, ...

  3. tfrecords转图片存储

    import os import shutil import tensorflow as tf import time import sys import cv2 # 图片存放位置 PATH_RES ...

  4. 使用 js 实现一个简易版的模版引擎

    使用 js 实现一个简易版的模版引擎 regex (function test() { this.str = str; })( window.Test = ...; format() { let ar ...

  5. js function call hacker

    js function call hacker you don't know javascript function https://developer.mozilla.org/en-US/docs/ ...

  6. DAPHNE PATEL:有主见的人,才能活出精彩人生

    有主见的人,会活出什么样子呢?近日,NGK灵石团队技术副总裁DAPHNE 女士给出了答案. DAPHNE PATEL表示,有主见的人,才能活出精彩的人生.为什么这么说呢? DAPHNE PATEL用自 ...

  7. USDN稳定币应用区块链旅游业

    比特币是区块链1.0时代的标志性产品,稳定币则是区块链2.0时代的标志性产品.在稳定币鼻祖USDT爆出"超发"新闻后曾引发市场的动荡,之后新兴稳定币如春笋般涌现.据不完全同济,目前 ...

  8. 听说USDN最近很火,它究竟是什么?

    最近USDN在各大社区沸沸扬扬,甚至很多人都说USDN将会打破稳定币市场的格局,那么USDN究竟是怎样的一种稳定币呢?小编今天就帮助大家了解一下,新一代算法型稳定币USDN. USDN是基于公链NGK ...

  9. NGK公链全面服务旅游经济

    有数据显示,2019 年全球旅游总收入已达 6.5万亿美元, 占全球 GDP 的 7.3%,旅游业发展所创造的收益,于全球经济的重要性,不言而喻. 在旅游产业蓬勃发展的同时,中心化运营模式下却仍存在痛 ...

  10. sql server 局域网与公网上的发布与订阅

    一台局域网的服务器,可以访问公网. 一台云端的服务器. 要求:将局域网中的服务器部分数据库同步到云端的服务器上. 配置情况: win server 2012 是发布服务器. win server 20 ...