求调线段树模版代码(玄2关)
  • 板块灌水区
  • 楼主OIDragon
  • 当前回复9
  • 已保存回复10
  • 发布时间2024/3/9 15:55
  • 上次更新2024/3/9 17:32:37
查看原帖
求调线段树模版代码(玄2关)
775893
OIDragon楼主2024/3/9 15:55

区间加,区间求minmin

代码:

#include <bits/stdc++.h>
using namespace std;
int n,m,p,ad[4000005],s[4000005];
void add(int k,int l,int r,int v)
{
	ad[k] += v;
	s[k] += v * (r - l + 1);
}
void pd(int k,int l,int r,int mid)
{
	if(ad[k] == 0)
	{
		return;
	}
	add(k * 2,l,mid,ad[k]);
	add(k * 2 + 1,mid + 1,r,ad[k]);
	ad[k] = 0;
}
int query(int k,int l,int r,int x,int y)
{
	if(l >= x && r <= y)
	{
		return s[k];
	}
	int mid = (l + r) / 2,ans = 2e9;
	pd(k,l,r,mid);
	if(x <= mid)
	{
		ans = min(ans,query(k * 2,l,mid,x,y));
	}
	if(mid < y)
	{
		ans = min(ans,query(k * 2 + 1,mid + 1,r,x,y));
	}
	return ans;
}
void mdf(int k,int l,int r,int x,int y,int v)
{
	if(l >= x && r <= y)
	{
		return add(k,l,r,v);
	}
	int mid = (l + r) / 2;
	pd(k,l,r,mid);
	if(x <= mid)
	{
		mdf(k * 2,l,mid,x,y,v);
	}
	if(mid < y)
	{
		mdf(k * 2 + 1,mid + 1,r,x,y,v);
	}
	s[k] = min(s[k * 2],s[k * 2 + 1]);
}
int main()
{
    scanf("%d%d%d",&n,&m,&p);
	m += p; 
    while(m--)
    {
    	int f,x,y;
    	scanf("%d%d%d",&f,&x,&y);
    	if(f == 1)
    	{
    		mdf(1,1,n,x,y,1);
    	}
    	else
    	{
    		printf("%d\n",query(1,1,n,x,y));
    	}
    }
	return 0;
}

死活调不出来了,请求帮助,拜谢!

2024/3/9 15:55
加载中...