题面

LOJ 3153

solution

  • 对于任意一对\(A,B\),若区间\([A,B]\)中存在一个数权值大于\(A\)或\(B\),则用这个数来替代\(A\)或\(B\)显然更优。
  • 故只需要考虑每一个区间的最大值与次大值分别作为\(A,B\)。
  • 可以用单调栈\(O(n)\)找到每一对这样的\(A,B\)。
  • 考虑\(f[i]\)表示以\(i\)作为\(C\)时最大的\(A+B+C\),对于每一对\(A,B\),他们对应的\(C\)一定\(\ge (2*B-A)\)。
  • 离线处理询问,从大到小枚举\(A\),线段树区间修改即可

code

#include<bits/stdc++.h>
using namespace std;
#define ll long long
inline int read(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*f;
}
#define lc (p<<1)
#define rc (p<<1|1)
const int N=5e5+10;
int n,a[N],q;
ll ans[N];
stack<int>s;
vector<int> B[N];
vector<pair<int,int> >que[N];
struct tree{
ll mx,lazy,v;
}T[N<<2];
inline void pushup(int p){
T[p].mx=max(T[lc].mx,T[rc].mx);
}
inline void pushdown(int p){
if(!T[p].lazy) return;
T[lc].lazy=max(T[lc].lazy,T[p].lazy);
T[lc].mx=max(T[lc].mx,T[p].lazy+T[lc].v);
T[rc].lazy=max(T[rc].lazy,T[p].lazy);
T[rc].mx=max(T[rc].mx,T[p].lazy+T[rc].v);
T[p].lazy=0;
}
inline void build(int p,int l,int r){
if(l==r){
T[p].v=a[l];
return ;
}
int mid=(l+r)>>1;
build(lc,l,mid);
build(rc,mid+1,r);
T[p].v=max(T[lc].v,T[rc].v);
}
inline void update(int p,int l,int r,int ql,int qr,ll v){
if(ql<=l&&r<=qr){
T[p].lazy=max(T[p].lazy,v);
T[p].mx=max(T[p].mx,v+T[p].v);
return ;
}
pushdown(p);
int mid=(l+r)>>1;
if(ql<=mid) update(lc,l,mid,ql,qr,v);
if(qr>mid) update(rc,mid+1,r,ql,qr,v);
pushup(p);
}
inline ll query(int p,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr){
return T[p].mx;
}
pushdown(p);
int mid=(l+r)>>1;
ll ret=0;
if(ql<=mid) ret=max(ret,query(lc,l,mid,ql,qr));
if(qr>mid) ret=max(ret,query(rc,mid+1,r,ql,qr));
return ret;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%d",&a[i]);
while((!s.empty())&&a[s.top()]<a[i]) B[s.top()].push_back(i),s.pop();
if(!s.empty()) B[s.top()].push_back(i);
s.push(i);
}
build(1,1,n);
scanf("%d",&q);
for(int i=1;i<=q;++i){
int l,r;
scanf("%d%d",&l,&r);
que[l].push_back(make_pair(r,i) );
}
for(int i=n;i>=1;--i){
for(int j=0;j<B[i].size();++j){
int t=B[i][j];
if(t*2-i<=n) update(1,1,n,t*2-i,n,a[i]+a[t]);
}
for(int j=0;j<que[i].size();++j){
pair<int,int> p=que[i][j];
ans[p.second]=query(1,1,n,i,p.first);
}
}
for(int i=1;i<=q;++i)
printf("%lld\n",ans[i]);
return 0;
}

「LOJ 3153」 「JOI Open 2019」三级跳的更多相关文章

  1. LOJ#3054. 「HNOI 2019」鱼

    LOJ#3054. 「HNOI 2019」鱼 https://loj.ac/problem/3054 题意 平面上有n个点,问能组成几个六个点的鱼.(n<=1000) 分析 鱼题,劲啊. 容易想 ...

  2. LOJ #3049. 「十二省联考 2019」字符串问题

    LOJ #3049. 「十二省联考 2019」字符串问题 https://loj.ac/problem/3049 题意:给你\(na\)个\(A\)类串,\(nb\)个\(B\)类串,\(m\)组支配 ...

  3. LOJ#2351. 「JOI 2018 Final」毒蛇越狱

    LOJ#2351. 「JOI 2018 Final」毒蛇越狱 https://loj.ac/problem/2351 分析: 首先有\(2^{|?|}\)的暴力非常好做. 观察到\(min(|1|,| ...

  4. 【LOJ】#3051. 「十二省联考 2019」皮配

    LOJ#3051. 「十二省联考 2019」皮配 当时我在考场上觉得这题很不可做... 当然,出了考场后再做,我还是没发现学校和城市是可以分开的,导致我还是不会 事实上,若一个城市投靠了某个阵营,学校 ...

  5. 「ZJOI2019」&「十二省联考 2019」题解索引

    「ZJOI2019」&「十二省联考 2019」题解索引 「ZJOI2019」 「ZJOI2019」线段树 「ZJOI2019」Minimax 搜索 「十二省联考 2019」 「十二省联考 20 ...

  6. 【LOJ#6066】「2017 山东一轮集训 Day3」第二题(哈希,二分)

    [LOJ#6066]「2017 山东一轮集训 Day3」第二题(哈希,二分) 题面 LOJ 题解 要哈希是很显然的,那么就考虑哈希什么... 要找一个东西可以表示一棵树,所以我们找到了括号序列. 那么 ...

  7. 「WC 2019」数树

    「WC 2019」数树 一道涨姿势的EGF好题,官方题解我并没有完全看懂,尝试用指数型生成函数和组合意义的角度推了一波.考场上只得了 44 分也暴露了我在数数的一些基本套路上的不足,后面的 \(\ex ...

  8. 「LOJ 556 Antileaf's Round」咱们去烧菜吧

    「LOJ 556 Antileaf's Round」咱们去烧菜吧 最近在看 jcvb 的生成函数课件,顺便切一切上面讲到的内容的板子题,这个题和课件上举例的背包计数基本一样. 解题思路 首先列出答案的 ...

  9. [LOJ#6437][BZOJ5373]「PKUSC2018」PKUSC

    [LOJ#6437][BZOJ5373]「PKUSC2018」PKUSC 试题描述 九条可怜是一个爱玩游戏的女孩子. 最近她在玩一个无双割草类的游戏,平面上有 \(n\) 个敌人,每一个敌人的坐标为 ...

随机推荐

  1. 蓝桥杯2020 E:七段码

    题解 正规解法是 dfs + 并查集,首先用 dfs 将其所有的情况枚举出来,再用并查集来判断是否在一个连通块上. 许多小伙伴计算的答案为76,主要是判断连通块这方面有问题,倘若不用并查集,直接枚举一 ...

  2. 从Linux源码看TIME_WAIT状态的持续时间

    从Linux源码看TIME_WAIT状态的持续时间 前言 笔者一直以为在Linux下TIME_WAIT状态的Socket持续状态是60s左右.线上实际却存在TIME_WAIT超过100s的Socket ...

  3. 【django-simpleui】‘simpletags‘ is not a registered tag library报错的解决方法

    1:创建  templatetags文件夹 2:创建simpletags.py文件将内容粘贴进去,在下面 3:setting.py添加文件指定: 1 TEMPLATES = [ 2 { 3 'BACK ...

  4. 制作安装Linux操作系统的启动U盘方法其实就这么简单

    安装系统前,我们需要制作系统安装启动U盘(或者DVD,但已经很少使用DVD,所以不再介绍),通过启动U盘来帮助我们安装下载好的Linux系统. 接下来我们来介绍在Windows.Linux和MacOS ...

  5. 第一行代码中RecyclerView添加依赖库问题

    现在更新到 implementation 'com.android.support:recyclerview-v7:29.2.1' 记得点Sync Now来进行同步.

  6. 深入学习OpenCV文档扫描及OCR识别(文档扫描,图像矫正,透视变换,OCR识别)

    如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 下面 ...

  7. -bash: bash_profile: command not found问题

    这个问题一般就是.bash_profile 文件内容错误,里面内容没加注释之内的,vi .bash_profile打开文件检查一下,然后:wq!保存退出 我的错误就是红圈处没有注释造成的

  8. 巧用IDM工具 快捷下载ASTER GDEM v3高程数据

    ASTER GDEM v3是NASA推出的30米高清DEM,覆盖了几乎全部的地球陆地.那么,在NASA官网怎么下载ASTER GDEM v3的地形高程数据呢? 首先,你需要注册一个nasa的账号 注册 ...

  9. jquery实现回车键执行ajax

    $('#txtKey').bind('keypress',function(event){ if(event.keyCode == "13") { alert(1) }});

  10. shell 之 -f -z -e -o -a -d

    # -f 文件存在 if[ -f /etc/sysconfig/network ]; then ./etc/sysconfig/network fi # -z 字串为空/ -o or / -a and ...