求助初始化
查看原帖
求助初始化
753009
I_am_sb___楼主2023/6/21 17:18

本人样例第一个询问会输出一个奇怪的数,应该是初始化的问题,求调

#include <iostream>
#include <algorithm>
#include <string.h>
#include <string>
#include <cmath>
#include <queue>
#include <vector>
#include <map>
#include <set>
#include <random>

#define ls u << 1
#define rs u << 1 | 1

using namespace std;

inline int read()
{
    int s=0,w=1;
    char c=getchar();
    while (!isdigit(c)){if(c=='-')w=-1;c=getchar();}
    while(isdigit(c)) s=s*10+(c^48),c=getchar();
    return s*w;
}

inline void write(int x)
{
    if(x < 0) putchar('-'),x=-x;
    if(x > 9) write(x/10);
    putchar(x%10+'0');
}

inline int max_of_3 (int x , int y , int z)
{
    return max(x , max(y , z));
}

const int N = 500007 , inti = -1e9;

int n , m;
int a[N] , b[N];

struct node
{
	int l , r;
    int max_sum_ , max__sum , ans;
    int maxA , minB; 
} tree[N << 2];

void pushup(int u)
{
	tree[u].maxA = max(tree[ls].maxA , tree[rs].maxA);
	tree[u].minB = min(tree[ls].minB , tree[rs].minB);
	tree[u].max_sum_ = max_of_3(tree[ls].max_sum_ , tree[rs].max_sum_ , tree[ls].maxA - tree[rs].minB);
	tree[u].max__sum = max_of_3(tree[rs].max__sum , tree[ls].max__sum , tree[rs].maxA - tree[ls].minB);
	tree[u].ans = max(max(tree[ls].ans, tree[rs].ans) , max(tree[ls].max_sum_ + tree[rs].maxA , tree[rs].max__sum + tree[ls].maxA));
}

void build(int u , int l , int r) 
{
	tree[u].l = l, tree[u].r = r;
	tree[u].max_sum_ = tree[u].max__sum = tree[u].ans = -1e9;
	if(l == r) 
    {
		tree[u].maxA = a[l], tree[u].minB = b[l];
        return;
	} 
    int mid = (l + r) >> 1;
	build(ls , l , mid);build(rs , mid + 1 , r);
	pushup(u);
}

void modify_(int u , int x , int k) 
{
	if(tree[u].l > x || tree[u].r < x) return;
	if(tree[u].l == tree[u].r) 
    {
        tree[u].maxA = k;
        return;
    }
	modify_(ls , x , k);modify_(rs , x , k);
    pushup(u);
}

void modify__(int u , int x , int k) 
{
	if(tree[u].l > x || tree[u].r < x) return;
	if(tree[u].l == tree[u].r) 
    {
        tree[u].minB = k;
        return;
    }
	modify__(ls , x , k);modify__(rs , x , k);
    pushup(u);
}

int query(int u , int l , int r) 
{
	if(tree[u].l > r || tree[u].r < l) return tree[0].ans;
	if(tree[u].l >= l && tree[u].r <= r) return tree[u].ans;
    return query(ls , l , r) + query(rs , l , r);
}

int main(){
	n = read();m = read();
	for(int i = 1 ; i <= n ; ++ i) a[i] = read(); 
	for(int i = 1 ; i <= n ; ++ i) b[i] = read();
    tree[0].max_sum_ = tree[0].max__sum = tree[0].ans = inti;
	tree[0].minB = 1e9;
    build(1 , 1 , n);
    int flag;
    int a , b;
	for(int i = 0 ; i < m ; ++ i) 
    {
		flag = read();a = read();b = read();
		if(flag == 1) modify_(1 , a , b);
		else if(flag == 2) modify__(1 , a , b);
		else
        {
            write(query(1 , a , b));
            puts("");
        }
	}
	return 0;
}
2023/6/21 17:18
加载中...