关于memset
查看原帖
关于memset
1046173
With_U楼主2025/1/22 12:18

AC code:

#include<bits/stdc++.h>

#define int long long

using namespace std;

const int maxn = 1e6+99 , inf = 1e11;

int n , q , a[maxn] , w[maxn*4] , lzy[maxn*4] , lzy2[maxn*4];

void pushup(int u)
{
	w[u] = max(w[u*2],w[u*2+1]);
}

void build(int u , int l , int r)
{
	lzy2[u] = inf;
	if (l == r)
	{
		w[u] = a[l];
		return ;
	}
	int mid = (l+r)/2;
	build(u*2,l,mid);
	build(u*2+1,mid+1,r);
	pushup(u);
}

void maketag(int u , int len , int op , int x)
{
	
	if (op == 2)
	{
		w[u] += x;
		lzy[u] += x;
	}
	else
	{
		w[u] = x;
		lzy[u] = 0;
		lzy2[u] = x;
	}
}

void pushdown(int u , int l , int r)
{
	int mid = (l+r)/2;
	if (lzy2[u] != inf)
	{
		maketag(u*2,mid-l+1,1,lzy2[u]);
		maketag(u*2+1,r-mid,1,lzy2[u]);
		lzy2[u] = inf;
	}
	maketag(u*2,mid-l+1,2,lzy[u]);
	maketag(u*2+1,r-mid,2,lzy[u]);
	lzy[u] = 0;
}

void update(int u , int l , int r, int L , int R , int op , int x)
{
	if (l >= L && r <= R)
	{
		maketag(u,r-l+1,op,x);
	}
	else if (!((l > R) || (r < L)))
	{
		int mid = (l+r)/2;
		pushdown(u,l,r);
		if (mid >= L)update(u*2,l,mid,L,R,op,x);
		if (mid <= R)update(u*2+1,mid+1,r,L,R,op,x);
		pushup(u);
	}
	
}

int query(int u , int l , int r , int L , int R)
{
	if (l >= L && r <= R)
	{
		return w[u];
	}
	else if (!((l > R) || (r < L)))
	{
		pushdown(u,l,r);
		int mid = (l+r)/2;
		return max(query(u*2,l,mid,L,R),query(u*2+1,mid+1,r,L,R));
	}
	else
	{
		return -inf;
	}
}

signed main()
{
	scanf("%lld%lld",&n,&q);
	for (int i = 1;i <= n;i++)
	{
		scanf("%lld",&a[i]);
	}
	build(1,1,n);
	for (int i = 1;i <= q;i++)
	{
		int op , l ,r , x;
		scanf("%lld%lld%lld",&op,&l,&r);
		
		if (op != 3)
		{
			scanf("%lld",&x);
			update(1,1,n,l,r,op,x);
		}
		else
		{
			printf("%lld\n",query(1,1,n,l,r));
		}
		
	}
	return 0;
}

样例不过:

#include<bits/stdc++.h>

#define int long long

using namespace std;

const int maxn = 1e6+99 , inf = 1e11;

int n , q , a[maxn] , w[maxn*4] , lzy[maxn*4] , lzy2[maxn*4];

void pushup(int u)
{
	w[u] = max(w[u*2],w[u*2+1]);
}

void build(int u , int l , int r)
{
	if (l == r)
	{
		w[u] = a[l];
		return ;
	}
	int mid = (l+r)/2;
	build(u*2,l,mid);
	build(u*2+1,mid+1,r);
	pushup(u);
}

void maketag(int u , int len , int op , int x)
{
	
	if (op == 2)
	{
		w[u] += x;
		lzy[u] += x;
	}
	else
	{
		w[u] = x;
		lzy[u] = 0;
		lzy2[u] = x;
	}
}

void pushdown(int u , int l , int r)
{
	int mid = (l+r)/2;
	if (lzy2[u] != inf)
	{
		maketag(u*2,mid-l+1,1,lzy2[u]);
		maketag(u*2+1,r-mid,1,lzy2[u]);
		lzy2[u] = inf;
	}
	maketag(u*2,mid-l+1,2,lzy[u]);
	maketag(u*2+1,r-mid,2,lzy[u]);
	lzy[u] = 0;
}

void update(int u , int l , int r, int L , int R , int op , int x)
{
	if (l >= L && r <= R)
	{
		maketag(u,r-l+1,op,x);
	}
	else if (!((l > R) || (r < L)))
	{
		int mid = (l+r)/2;
		pushdown(u,l,r);
		if (mid >= L)update(u*2,l,mid,L,R,op,x);
		if (mid <= R)update(u*2+1,mid+1,r,L,R,op,x);
		pushup(u);
	}
	
}

int query(int u , int l , int r , int L , int R)
{
	if (l >= L && r <= R)
	{
		return w[u];
	}
	else if (!((l > R) || (r < L)))
	{
		pushdown(u,l,r);
		int mid = (l+r)/2;
		return max(query(u*2,l,mid,L,R),query(u*2+1,mid+1,r,L,R));
	}
	else
	{
		return -inf;
	}
}

signed main()
{
	scanf("%lld%lld",&n,&q);
	for (int i = 1;i <= n;i++)
	{
		scanf("%lld",&a[i]);
	}
	memset(lzy2 , inf , sizeof lzy2);
	build(1,1,n);
	for (int i = 1;i <= q;i++)
	{
		int op , l ,r , x;
		scanf("%lld%lld%lld",&op,&l,&r);
		
		if (op != 3)
		{
			scanf("%lld",&x);
			update(1,1,n,l,r,op,x);
		}
		else
		{
			printf("%lld\n",query(1,1,n,l,r));
		}
		
	}
	return 0;
}

为什么用memset会出问题

2025/1/22 12:18
加载中...