当前位置: 首页 > news >正文

codeforces 2057D. Gifts Order

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

题目大意

给定一个长度为n数组 an

设l~r的最大价值为
m a x ( a l , a l + 1 , . . . , a r ) − m i n ( a l , a l + 1 , . . . , a r ) − ( r − l ) max(a_l,a_{l+1},...,ar)-min(a_l,a_{l+1},...,ar)-(r-l) max(al,al+1,...,ar)min(al,al+1,...,ar)(rl)

共有两种操作,一是给你位置p和值x,修改第p个位置的值为x
第二是an数组中选择一个l,r,使得l~r为数组的最大价值

思路

分析一下,当最大值在左边,最小值在右边时,式子可变为 ( a l + l ) − ( a r + r ) (a_l+l)-(a_r+r) (al+l)(ar+r),相反则为 ( a r − r ) − ( a l − l ) (a_r-r)-(a_l-l) (arr)(all)
所以针对两种情况我们可以化简为 a i + i a_i+i ai+i a i − i a_i-i aii
维护每个区间的两种情况的最大值最小值
区间(1~n)查询和单点修改,可以用线段树来解决,
设数组tr,第一维度 0 代表 a l > a r , 1 代表 a l < = a r 0代表al>ar,1代表al<=ar 0代表al>ar,1代表al<=ar
第二维0代表区间最小值,1代表区间最大值,val数组代表当前节点的最大价值
在pushup操作求节点最大值时,可以是两个子节点的最大值,也可以是以下两种情况
a l > a r a_l>a_r al>ar时(ai+i),即最大值在左边,最小值在右边,那么就用左边的最大值减去左边的最小值
a l < = a r a_l<=a_r al<=ar时(ai-i),即最大值在右边,最小值在左边的情况,就用右边的最大值减去左边的最小值

// Author: zengyz
// 2025-06-12 18:15#include <bits/stdc++.h>using namespace std;
using i64 = long long;
const int N = 2e5 + 10;
int tr[2][2][N * 4], val[N * 4];
int a[N];
void pushup(int u)
{tr[0][0][u] = min(tr[0][0][u << 1], tr[0][0][u << 1 | 1]);tr[0][1][u] = max(tr[0][1][u << 1], tr[0][1][u << 1 | 1]);tr[1][0][u] = min(tr[1][0][u << 1], tr[1][0][u << 1 | 1]);tr[1][1][u] = max(tr[1][1][u << 1], tr[1][1][u << 1 | 1]);val[u] = max(tr[0][1][u << 1] - tr[0][0][u << 1 | 1], tr[1][1][u << 1 | 1] - tr[1][0][u << 1]);val[u] = max(val[u], max(val[u << 1], val[u << 1 | 1]));
}
void build(int u, int l, int r)
{if (l == r){tr[0][0][u] = tr[0][1][u] = a[l] + l;tr[1][0][u] = tr[1][1][u] = a[l] - l;val[u] = 0;return;}else{int mid = (l + r) >> 1;build(u << 1, l, mid);build(u << 1 | 1, mid + 1, r);pushup(u);}
}
void modify(int u, int l, int r, int p, int x)
{if (l == r){tr[0][0][u] = tr[0][1][u] = x + p;tr[1][0][u] = tr[1][1][u] = x - p;return;}int mid = (l + r) >> 1;if (p <= mid)modify(u << 1, l, mid, p, x);elsemodify(u << 1 | 1, mid + 1, r, p, x);pushup(u);
}void solve()
{int n, q;cin >> n >> q;for (int i = 1; i <= n; i++)cin >> a[i];build(1, 1, n);cout << val[1] << endl;while (q--){int p, x;cin >> p >> x;a[p] = x;modify(1, 1, n, p, x);cout << val[1] << endl;}return;
}int main()
{ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int _T = 1;cin >> _T;while (_T--){solve();}return 0;
}

相关文章:

  • springboot3+mybatisplus(5)-backend-mybaitsplus+frontend-router
  • 7.8 Evaluating the finetuned LLM
  • Linux下OLLAMA安装卡住怎么办?
  • uni-app项目怎么实现多服务环境切换
  • LangChain--(1)
  • 如何将一个url地址打包成一个windows桌面版本的应用程序
  • 质因数分解_java
  • Redis哨兵机制
  • 基于SpringAI实现专家系统
  • echarts中给饼图加圆点
  • 关于深度学习网络中的归一化BN
  • 【Java面试笔记:实战】41、Java面试核心考点!AQS原理及应用生态全解析
  • 【亲测有效】MybatisPlus中MetaObjectHandler自动填充字段失效
  • 【cv学习笔记】YOLO系列笔记
  • 树莓派5 ubuntu 24.04 docker配置镜像Docker pull时报错:https://registry-1.docker.io/v2/
  • 海外广告投放|FB IG 速推帖子有效吗?
  • 测试过程中有哪些风险?
  • 3.4_1 流量控制、可靠传输与滑动窗口机制
  • 【Spring AI 1.0.0】Spring AI 1.0.0框架快速入门(2)——提示词
  • 简述Python里面search和match的区别
  • 微信官网电脑版下载/seo搜索优化培训
  • 哪些网站是同字形网页/企业建站要多少钱
  • 对网站进行seo优化/原创文章代写平台
  • wordpress 悬赏功能/化工seo顾问
  • 门户网站制作需要多少钱/蚁坊软件舆情监测系统
  • 学校网站建设用哪个系统/网站优化技巧