尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

P8037 [COCI2015-2016#7] Prokletnik 题解

P8037 [COCI2015-2016#7] Prokletnik 题解
📅 发布时间:2026/6/20 6:56:29

如果你做过 GSS2,那么你会发现它们很像,都是询问最优子段的问题。

这里有一个 trick,对于这一类询问最优子段的问题,首先考虑将询问离线,然后扫描线。若当前扫描到 \(i\),设 \(f_j\) 表示以 \(j\) 为左端点,\(i\) 为右端点的子段信息,可以维护 \(f_j\) 的历史最值求解。

如何理解这个历史最值。由于是扫描线依次添加每一个位置,那么 \(f_j\) 的历史最值即为以 \(j\) 为左端点,且右端点在 \([j, i]\) 的最优子段。可以用线段树维护区间历史最值。

那么问题在于如何维护 \(f_j\)。不妨设左小右大,那么左大右小将序列取倒数即可。

不难发现,若 \(i\) 能够成为最大值,则 \(\max\limits_{k\in[j,i]}{a_k} \le a_i\)。可以用单调栈维护 \(L_i\) 表示 \(i\) 左边第一个小于 \(a_i\) 的数的位置,则 \(j \in (L_i, i]\)。

考虑哪些 \(j\) 是合法的。在扫描线的同时维护一个单调栈,单调不减。那么在栈中的位置一定是合法的 \(j\),弹出位置一定不合法。将不合法的位置标记,则 \((L_i, i]\) 中未被标记的位置即为所有合法的 \(j\)。用线段树区间修改即可。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6 + 5;
int n, Q, a[N], L[N], ans[N];
struct node
{int l, r, id;
};
vector<node> q;
struct Tree
{int maxi, tag, hismaxi, histag;
}tree[N << 2];
#define ls (cur << 1)
#define rs (cur << 1 | 1)
#define mid (lt + rt >> 1)
void pushup(int cur)
{tree[cur].maxi = max(tree[ls].maxi, tree[rs].maxi);tree[cur].hismaxi = max(tree[ls].hismaxi, tree[rs].hismaxi);return;
}
void build(int cur, int lt, int rt)
{tree[cur] = {0, 0, 0, 0};if(lt == rt){tree[cur] = {-lt + 1, 0, 0, 0};return;}build(ls, lt, mid), build(rs, mid + 1, rt);return pushup(cur);
}
void addtag(int cur, int tag, int histag)
{tree[cur].hismaxi = max(tree[cur].hismaxi, tree[cur].maxi + histag), tree[cur].maxi += tag;tree[cur].histag = max(tree[cur].histag, tree[cur].tag + histag), tree[cur].tag += tag;return;
}
void pushdown(int cur)
{if(!tree[cur].tag && !tree[cur].histag)return;addtag(ls, tree[cur].tag, tree[cur].histag);addtag(rs, tree[cur].tag, tree[cur].histag);tree[cur].tag = 0, tree[cur].histag = 0;return;
}
void update(int cur, int lt, int rt, int l, int r, int val)
{if(r < lt || rt < l)return;if(l <= lt && rt <= r){tree[cur].tag += val, tree[cur].histag = max(tree[cur].histag, tree[cur].tag);tree[cur].maxi += val, tree[cur].hismaxi = max(tree[cur].hismaxi, tree[cur].maxi);return;}pushdown(cur);update(ls, lt, mid, l, r, val), update(rs, mid + 1, rt, l, r, val);return pushup(cur);
}
int query(int cur, int lt, int rt, int l, int r)
{if(r < lt || rt < l)return 0;if(l <= lt && rt <= r)return tree[cur].hismaxi;pushdown(cur);return max(query(ls, lt, mid, l, r), query(rs, mid + 1, rt, l, r));
}
void solve()
{stack<int> stk;for(int i = n; i; i--){while(!stk.empty() && a[stk.top()] < a[i])L[stk.top()] = i + 1, stk.pop();stk.push(i);}while(!stk.empty())L[stk.top()] = 1, stk.pop();build(1, 1, n);int i = 0;for(auto [l, r, id] : q){while(i < r){i++;while(!stk.empty() && a[stk.top()] > a[i])update(1, 1, n, stk.top(), stk.top(), INT_MIN), stk.pop();stk.push(i);update(1, 1, n, L[i], i, i);update(1, 1, n, L[i], i, -i);}ans[id] = max(ans[id], query(1, 1, n, l, r));}return;
}
signed main()
{cin.tie(0) -> sync_with_stdio(0);cin >> n >> Q;for(int i = 1; i <= n; i++)cin >> a[i];for(int i = 1; i <= Q; i++){int l, r;cin >> l >> r;q.push_back({l, r, i});}sort(q.begin(), q.end(), [](auto x, auto y){return x.r < y.r;});solve();for(int i = 1; i <= n; i++)a[i] = -a[i];solve();for(int i = 1; i <= Q; i++)cout << ans[i] << "\n";return 0;
}

相关新闻

  • 【A】The Lost Ship in the Sky
  • 2025 AI 品牌最新推荐排行榜:聚焦商业落地能力,甄选懂需求的实力服务机构东北 Ai/大连 Ai/大连 Ai 培训/大连 Ai 开发/大连 Ai 推广公司推荐
  • 基于经验模态分解的去趋势波动分析(EMD-DFA)方法

最新新闻

  • 软件测试基础:黑盒、白盒、灰盒测试
  • 2026年工业工厂吸尘器Top3:Shiwosi史沃斯凭什么第一? - 工业清洁测评社
  • 多智能体系统中的向量化声誉传播机制TrustFlow解析
  • Qwen3vl多模态后训练实战:LLamaFactory深度适配指南
  • 国产MLU算网+LLaMA-Factory:零代码微调百余大模型实战指南
  • 猫抓插件:3步搞定浏览器资源嗅探的终极指南

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号