线段树板子求调
查看原帖
线段树板子求调
257173
rish楼主2024/12/31 13:48
#include <bits/stdc++.h>
using namespace std;
#define ls k<<1
#define rs k<<1|1 
const int N = 8e5+10;
long long n, m; 
long long f[N], s[N], a[N], len[N], tag[N];
void build(int k, int l, int r)
{
	if(l==r) {f[k] = s[k] = a[l];len[k] = 1;return;}
	int mid = l+r>>1;
	build(ls, l, mid);
	build(rs, mid+1, r);
	f[k] = min(f[ls], f[rs]);
	s[k] = s[ls]+s[rs];
	len[k] = len[ls]+len[rs];
}
void push_down(int k, int l, int r)
{
	if(!tag[k]) return;
	s[ls] += len[ls]*tag[k];
	f[ls] += tag[k];
	tag[ls] += tag[k]; 
	
	s[rs] += len[rs]*tag[k];
	f[rs] += tag[k];
	tag[rs] += tag[k];
	tag[k] = 0;
}
void update(int k, int l, int r, int x, int y, int v)
{
	if(x<=l&&r<=y)
	{
		f[k] += v;
		s[k] += len[k]*v;
		tag[k] += v;
		return;
	}
	push_down(k, l, r);
	int mid = l+r>>1;
	if(mid>=x) update(ls, l, mid, x, y, v);
	if(mid<y) update(rs, mid+1, r, x, y, v);
	f[k] = min(f[ls], f[rs]);
	s[k] = s[ls]+s[rs];
}
long long query(int k, int l, int r, int x, int y, int ty)
{
	if(x<=l&&r<=y)
	{
		if(ty) return s[k]; 
		return f[k];
	}
	long long mid = l+r>>1, res1 = 0, res2 = 3e20+10;
	if(mid>=x) res1 = query(ls, l, mid, x, y, ty), res2 = res1;
	if(mid<y) 
	{
		long long t = query(rs, mid+1, r, x, y, ty);
		res1 += t, res2 = min(res2, t);
	}
	if(ty) return res1;
	return res2;
}
int main()
{
	cin >> n >> m;
	for(int i=1;i<=4*n;i++) f[i] = 3e20+10;
	for(int i=1;i<=n;i++) cin >> a[i];
	build(1, 1, n);
	for(int i=1;i<=m;i++)
	{
		char op;
		int x, y, z;
		cin >> op >> x >> y;
		if(op=='M')	cout << query(1, 1, n, x, y, 0) << endl;
		else if(op=='S') cout << query(1, 1, n, x, y, 1) << endl;
		else//add
		{
			cin >> z;
			update(1, 1, n, x, y, z);
		}
	}
	return 0;
}

rt,lz原本准备10分钟打完,愣是被调了半小时也没发现错哪...

只有第一个点对了,其他全WA

2024/12/31 13:48
加载中...