首页 > 其他分享 >线段树+最大最小

线段树+最大最小

时间:2025-01-10 14:11:17浏览次数:1  
标签:lc int 线段 rc 最小 st pos ans 最大

https://codeforces.com/contest/2057/problem/D

#include<bits/stdc++.h>
#define lc p<<1
#define rc p<<1|1
#define INF 2e9
using namespace std;

#define endl '\n'
using ll = long long;
using pii = pair<int, int>;
const double PI = acos(-1);
const int N = 1e5 + 10;
const int mod = 1e9 + 7;

struct node{
	int addmax,addmin,submax,submin;
	int ans;
};
vector<node> st;
vector<int> a;
void pushup(int p){
	st[p].addmax=max(st[lc].addmax,st[rc].addmax);
	st[p].addmin=min(st[lc].addmin,st[rc].addmin);
	st[p].submax=max(st[lc].submax,st[rc].submax);
	st[p].submin=min(st[lc].submin,st[rc].submin);
	st[p].ans=max((st[rc].submax-st[lc].submin),(st[lc].addmax-st[rc].addmin));
	st[p].ans=max(st[p].ans,max(st[lc].ans,st[rc].ans));
	
}
void build(int p,int l,int r){
	if(l==r){
		st[p].addmax=a[l]+l;
		st[p].addmin=a[l]+l;
		st[p].submax=a[l]-l;
		st[p].submin=a[l]-l;
		st[p].ans=0;
		return;
	}
	int mid=(l+r)>>1;
	build(lc,l,mid);
	build(rc,mid+1,r);
	pushup(p);
}
void add(int p,int l,int r,int pos,int x){
	if(l==r){
		st[p].addmax=x+pos;
		st[p].addmin=x+pos;
		st[p].submax=x-pos;
		st[p].submin=x-pos;
		st[p].ans=0;
		return;
	}
	int mid=(l+r)>>1;
	if(pos<=mid) add(lc,l,mid,pos,x);
	else add(rc,mid+1,r,pos,x);
	pushup(p);
}
void solve() {
	int n,q;cin>>n>>q;
	st.clear();
	a.clear();
	st.resize(4*n);
	a.resize(n+1);
	for(int i=1;i<=n;i++)
		cin>>a[i];
	build(1,1,n);
	cout<<st[1].ans<<endl;
	while(q--){
		int pos,x;cin>>pos>>x;
		add(1,1,n,pos,x);
		cout<<st[1].ans<<endl;
	}
		
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr), cout.tie(nullptr);
	
	int T = 1;
	cin>>T;
	while (T--) {
		solve();
	}
	
	return 0;
}

标签:lc,int,线段,rc,最小,st,pos,ans,最大
From: https://www.cnblogs.com/laileou/p/18663880

相关文章

  • 子数组最大累加和
    [Algo]子数组最大累加和1.最大子数组和i//1.最大子数组和i//https://leetcode.cn/problems/maximum-subarray/description/intmaxSubArray(vector<int>&nums){vector<int>dp(nums.size());//dp[i]-以i位置作为结尾的最大子数组和dp[0]=nums[0];......
  • 洛谷题单指南-线段树的进阶用法-P3157 [CQOI2011] 动态逆序对
    原题链接:https://www.luogu.com.cn/problem/P3157题意解读:长度为n的序列,序列是1~n的排列,一共m个删除操作,每一个删除之前输出逆序对。解题思路:要计算静态的逆序对,可以通过树状数组、权值线段树等方式,时间复杂度都是O(nlogn)要计算动态的逆序对,算上每一次删除,暴力做法需要O(mnlo......
  • 如何修改PHP最大文件上传大小限制
    默认情况下,PHP上传文件大小限制是2M,超过2M上传将会报错。如果我们上传的图片或压缩包超过2M,需要修改PHP的配置文件最大上传限制。找到PHP组件目录下的php.ini文件,使用记事本打开,查找post_max_size(允许POST数据大小)值修改成10M或更大,查找upload_max_filesize(允许上传文件大小)值,可......
  • P1803 凌乱的yyy / 线段覆盖
    P1803凌乱的yyy/线段覆盖题目现在各大oj上有\(n\)个比赛,每个比赛的开始、结束的时间点是知道的。yyy认为,参加越多的比赛,noip就能考的越好(假的)。所以,他想知道他最多能参加几个比赛。由于yyy是蒟蒻,如果要参加一个比赛必须善始善终,而且不能同时参加\(2\)个及以上的......
  • 给定一个字符串,对该字符串进行删除操作,保留 k 个字符且相对位置不变,使字典序最小
    这是一个经典的编程问题,可以用单调栈的方法高效解决。以下是解题步骤和代码实现:问题描述给定一个字符串s和一个整数k,要求删除字符串中的一些字符,最终保留k个字符,且相对顺序不变,使得结果字符串字典序最小。解题思路单调栈维护最小字典序:使用一个栈来维护当前......
  • BZOJ4399 魔法少女LJJ —— 线段树合并
    题意提示对100%的数据0<=m<=400000,c<=7,所有出现的数均<=1000000000,所有出现的点保证存在【HINT】请认真阅读题面考语文分析由于只有合并,没有分裂,所以只需要考虑合并联通块中的信息即可。具体而言,在联通块的根对应的线段树下标存储该联通块下元素对应的权值。直接线段......
  • LeetCode 744. 寻找比目标字母大的最小字母
    问题描述给定一个字符数组letters,该数组按非递减顺序排序,以及一个字符target。letters里至少有两个不同的字符。任务是返回letters中大于target的最小的字符。如果不存在这样的字符,则返回letters的第一个字符。 解题思路这个问题可以通过以下步骤解决:排序:首先,......
  • 最小路径和(二维动态规划)
    给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。 示例1:输入:grid=[[1,3,1],[1,5,1],[4,2,1]]输出:7解释:因为路径1→3→1→1→1的总和最小。示例2:输入:grid=[[1,2......
  • 一种调试 线段树 / Treap / Splay / 左偏树 / LCT 等树形结构的技巧
    前言如果我们需要观察程序运行过程中,某一个变量、某一个序列的变化情况,你可以在修改的地方打断点debug,或者直接在需要的地方输出就行了。但是对于一些树形结构,我们不好将其直观地呈现出来,常常只是输出每一个结点的值,但是这就丢失了结点之间的连边情况。有时候不得不手动画图。......
  • 179. 最大数
    [题目链接](179.最大数-力扣(LeetCode))解题思路:x拼接y大于y拼接x后,那么x就应该放前面。自定义排序就行了。还要注意把前导0给去掉代码classSolution:defmyCompare(self,x,y):#比较两个字符串拼接后的结果ifstr(x)+str(y)>str(y)......