线段树求调
查看原帖
线段树求调
717781
zsyzsy_2012楼主2023/4/12 16:52

如题。

提交记录

#include "bits/stdc++.h"
#define int long long
#define N 500010
using namespace std ;
const int inf = (int)1e12 ;
int a[N] , b[N] ;
struct data{
	int maxa , maxakbj , minb , maxaibj , ans ;
}t[N * 4];
data merge(data A , data B) {
	data C ;
	C.maxa = max(A.maxa , B.maxa) ;
	C.minb = min(A.minb , B.minb) ;
	C.maxakbj = max(A.maxakbj , max(B.maxakbj , B.maxa - A.minb)) ;
	C.maxaibj = max(A.maxaibj , max(B.maxaibj , A.maxa - B.minb)) ;
	C.ans = max(A.ans , max(B.maxa + A.maxaibj , max(A.maxa + B.maxakbj , B.ans))) ;
	return C ;
}
void build(int cur , int l , int r) {
	if(l == r) {
		t[cur].maxa = a[l] ;
		t[cur].minb = b[l] ;
	}
	else {
		int mid = (l + r) / 2 ;
		build(2 * cur , l , mid) ;
		build(2 * cur + 1 , mid + 1 , r) ;
		t[cur] = merge(t[2 * cur] , t[2 * cur + 1]) ;
	}
}
void modify(int cur , int l , int r , int x) {
	if(l == r) {
		t[cur].maxa = a[l] ;
		t[cur].minb = b[l] ;
	}
	else {
		int mid = (l + r) / 2 ;
		if(x > mid) {
			modify(2 * cur + 1 , mid + 1 , r , x) ;
		}
		else {
			modify(2 * cur , l , mid , x) ;
		}
		t[cur] = merge(t[cur * 2] , t[cur * 2 + 1]) ;
	}
}
data find(int cur , int l , int r , int x , int y) {
	if(l == x && r == y) {
		return t[cur] ;
	}
	int mid = (l + r) / 2 ;
	data tot ;
	if(x > mid) {
		tot = find(2 * cur + 1 , mid + 1 , r , x , y) ;
	}
	else if(y > mid) {
		data ans1 = find(2 * cur , l , mid , x , mid) ;
		data ans2 = find(2 * cur + 1 , mid + 1 , r , mid + 1 , y) ;
		tot = merge(ans1 , ans2) ;
	}
	else {
		tot = find(2 * cur , l , mid , x , y) ;
	}
	return tot ;
}
signed main() {
	int n , m ;
	scanf("%lld%lld" , &n , &m) ;
	for(int i = 1 ; i <= n ; i++) {
		scanf("%lld" , &a[i]) ;
	}
	for(int i = 1 ; i <= n ; i++) {
		scanf("%lld" , &b[i]) ;
	}
	build(1 , 1 , n) ;
	while(m--) {
		int id , x , y ;
		scanf("%lld%lld%lld" , &id , &x , &y) ;
		if(id == 1) {
			a[x] = y ;
			modify(1 , 1 , n , x) ;
		}
		else if(id == 2) {
			b[x] = y ;
			modify(1 , 1 , n , x) ;
		}
		else {
			data qwq = find(1 , 1 , n , x , y) ;
			printf("%lld\n" , qwq.ans) ;
		}
	}
	return 0 ;
}
2023/4/12 16:52
加载中...