[Yaleigh Training Camp 2017 Day1] Market

Division of a segment tree:

EG: (Source: GDEZ2021 New Year's Day First Test Question 3)

update:

1. Interval plus

2. Interval division

(Convert to interval subtraction. When the maximum value in the interval is the same as after the minimum value is divided, save the value whose maximum value is less than the original value after the division, and then put it into lazytag lazytagIn l a z y t a g , you can remember to usefloor ( ( double ) x / y ) floor ((double)x/y)floor((double)x/y )

query: 1. interval and 2. interval minimum

Topic: Problem C: [Yaleigh Training Camp 2017 Day1] Market

$ Code $

#include<bits/stdc++.h>
using namespace std;

#define int long long
const int maxn = 100005;
int n, q;
int inpt[maxn];
struct node{
    
    
	int l, r;
	int tag, sum;
	int mn, mx;
}t[4 * maxn];

inline void build (int i, int l, int r)
{
    
    
	t[i].l = l, t[i].r = r;
	if (l == r)
	{
    
    
		t[i].mn = t[i].sum = t[i].mx = inpt[l];
		return;
	}
	int mid = (l + r) >> 1;
	build (i << 1, l, mid);
	build (i << 1 | 1, mid + 1, r);
	t[i].sum = t[i << 1].sum + t[i << 1 | 1].sum;
	t[i].mn = min (t[i << 1].mn, t[i << 1 | 1].mn);
	t[i].mx = max (t[i << 1].mx, t[i << 1 | 1].mx);
	return;
}

inline void push_down (int i)
{
    
    
	if (t[i].tag)
	{
    
    
		int lenl, lenr;
		lenl = t[i << 1].r - t[i << 1].l + 1;
		lenr = t[i << 1 | 1].r - t[i << 1 | 1].l + 1;//len
		t[i << 1].tag += t[i].tag;
		t[i << 1 | 1].tag += t[i].tag;
		t[i << 1].mx += t[i].tag;
		t[i << 1 | 1].mx += t[i].tag;
		t[i << 1].mn += t[i].tag;
		t[i << 1 | 1].mn += t[i].tag;
		t[i << 1].sum += 1ll * t[i].tag * lenl;
		t[i << 1 | 1].sum += 1ll * t[i].tag * lenr;
	}
	t[i].tag = 0;
	return;
}

inline int div (int x, int y)
{
    
    
	return floor ((double)x / y);
}

inline void update_add (int i, int l, int r, int k)
{
    
    
	if (t[i].l >= l and t[i].r <= r)
	{
    
    
		t[i].tag += k;
		t[i].mn += k;
		t[i].mx += k;
		int len = t[i].r - t[i].l + 1;
		t[i].sum += (1ll * k * len);
		return;
	}
	push_down (i);
	if (t[i << 1].r >= l) update_add (i << 1, l, r, k);
	if (t[i << 1 | 1].l <= r) update_add (i << 1 | 1, l, r, k);
	t[i].sum = t[i << 1].sum + t[i << 1 | 1].sum;
	t[i].mn = min (t[i << 1].mn, t[i << 1 | 1].mn);
	t[i].mx = max (t[i << 1].mx, t[i << 1 | 1].mx);
	return;
}

inline void update_chu (int i, int l, int r, int k)
{
    
    
	if (t[i].l >= l and t[i].r <= r and t[i].mx - floor ((double)t[i].mx / k) == t[i].mn - floor ((double)t[i].mn / k))
	{
    
    
		int d = floor ((double)t[i].mx / k) - t[i].mx;
		t[i].tag += d;
		t[i].mn += d;
		t[i].mx += d;
		t[i].sum += d * (t[i].r - t[i].l + 1);
		return;
	}
	push_down (i);
	if (t[i << 1].r >= l) update_chu (i << 1, l, r, k);
	if (t[i << 1 | 1].l <= r) update_chu (i << 1 | 1, l, r, k);
	t[i].sum = t[i << 1].sum + t[i << 1 | 1].sum;
	t[i].mn = min (t[i << 1].mn, t[i << 1 | 1].mn);
	t[i].mx = max (t[i << 1].mx, t[i << 1 | 1].mx);
}

inline int query_min (int i, int l, int r)
{
    
    
	if (t[i].l >= l and t[i].r <= r) return t[i].mn;
	push_down (i);
	int s = 1e9 + 5, ss = 1e9 + 5;
	if (t[i << 1].r >= l) s = query_min (i << 1, l, r);
	if (t[i << 1 | 1].l <= r) ss = query_min (i << 1 | 1, l, r);
	return min (s, ss);
}

inline int query_sum (int i, int l, int r)
{
    
    
	if (t[i].l >= l and t[i].r <= r) return t[i].sum;
	push_down (i);
	int s = 0;
	if (t[i << 1].r >= l) s += query_sum (i << 1, l, r);
	if (t[i << 1 | 1].l <= r) s += query_sum (i << 1 | 1, l, r);
	return s;
}

signed main ()
{
    
    
	scanf ("%lld %lld", &n, &q);
	for (int i = 1; i <= n; i++) scanf ("%lld", &inpt[i]);
	build (1, 1, n);
	for (int i = 1; i <= q; i++)
	{
    
    
		int pos, l, r;
		scanf ("%lld %lld %lld", &pos, &l, &r);
		l += 1, r += 1;
		if (pos == 1)
		{
    
    
			int c;
			scanf ("%lld", &c);
			update_add (1, l, r, c);
		}
		else if (pos == 2)
		{
    
    
			int d;
			scanf ("%lld", &d);
			update_chu (1, l, r, d);
		}
		else if (pos == 3)
		{
    
    
			printf ("%lld\n", query_min (1, l, r));
		}
		else if (pos == 4)
		{
    
    
			printf ("%lld\n", query_sum (1, l, r));
		}
	}
	return 0;
}

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324034483&siteId=291194637