ABC F题求调
  • 板块学术版
  • 楼主Vitamin_B
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/6/9 00:01
  • 上次更新2024/6/9 10:48:32
查看原帖
ABC F题求调
743373
Vitamin_B楼主2024/6/9 00:01

rt,样例还没过,求帮忙一起调

# pragma GCC optimize("Ofast,no-stack-protector")

# pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")

# include <bits/stdc++.h>

using namespace std;

typedef long long ll;

typedef pair <int, int> pii;

const ll mod = 998244353;

int n, m, op, l, r;

ll a[200005], b[200005], sa[800005], sb[800005], mul[800005], lazya[800005], lazyb[800005], k;

void pushup (int x, int l, int r) {

	sa[x] = sa[l] + sa[r], sb[x] = sb[l] + sb[r], mul[x] = mul[l] + mul[r];

	sa[x] %= mod, sb[x] %= mod, mul[x] %= mod;

	return ;

}

void build (int x, int l, int r) {

	if (l == r) {

		sa[x] = a[l], sb[x] = b[l], mul[x] = a[l] * b[l] % mod;

		return ;

	}

	int mid = l + r >> 1, L = x << 1, R = L | 1;

	build (L, l, mid), build (R, mid + 1, r);

	pushup (x, L, R);

	return ;

}

void pushdown (int x, int mid, int l, int r, int L, int R) {
//	cout << l << '~' << r << ':' << lazya[x] << ',' << lazyb[x] << ';' << sa[x] << ',' << sb[x] << ',' << mul[x] << '\n';
	mul[L] += lazya[x] * lazyb[x] % mod * (mid - l + 1) + lazya[x] * sb[L] + lazyb[x] * sa[L], mul[L] %= mod;

	mul[R] += lazya[x] * lazyb[x] % mod * (r - mid) + lazya[x] * sb[R] + lazyb[x] * sa[R], mul[R] %= mod;

	sa[L] += (l - mid + 1) * lazya[x], sa[R] += (r - mid) * lazya[x], sa[L] %= mod, sa[R] %= mod;

	sb[L] += (l - mid + 1) * lazyb[x], sb[R] += (r - mid) * lazyb[x], sb[L] %= mod, sb[R] %= mod;

	lazya[L] += lazya[x], lazya[R] += lazya[x], lazya[L] %= mod, lazya[R] %= mod;

	lazyb[L] += lazyb[x], lazyb[R] += lazyb[x], lazyb[L] %= mod, lazyb[R] %= mod;

	lazya[x] = lazyb[x] = 0;

	return ;

}

void change1 (int now, int l, int r, int x, int y) {

	if (l == x && r == y) {

		mul[now] += k * sb[now], mul[now] %= mod;

		sa[now] += (r - l + 1) * k, sa[now] %= mod;

		lazya[now] += k, lazya[now] %= mod;

		return ;

	}

	int mid = l + r >> 1, L = now << 1, R = L | 1;

	pushdown (now, mid, l, r, L, R);

	if (mid >= y)
		change1 (L, l, mid, x, y);
	else if (mid < x)
		change1 (R, mid + 1, r, x, y);
	else
		change1 (L, l, mid, x, mid), change1 (R, mid + 1, r, mid + 1, y);

	pushup (x, L, R);

	return ;

}

void change2 (int now, int l, int r, int x, int y) {

	if (l == x && r == y) {

		mul[now] += k * sa[now], mul[now] %= mod;

		sb[now] += (r - l + 1) * k, sb[now] %= mod;

		lazyb[now] += k, lazyb[now] %= mod;

		return ;

	}

	int mid = l + r >> 1, L = now << 1, R = L | 1;

	pushdown (now, mid, l, r, L, R);

	if (mid >= y)
		change2 (L, l, mid, x, y);
	else if (mid < x)
		change2 (R, mid + 1, r, x, y);
	else
		change2 (L, l, mid, x, mid), change2 (R, mid + 1, r, mid + 1, y);

	pushup (x, L, R);

	return ;

}

ll find (int now, int l, int r, int x, int y) {
//	cerr << l << '~' << r << ':' << sa[now] << ',' << sb[now] << ',' << mul[now] << '\n';
	if (l == x && r == y)
		return mul[now];

	int mid = l + r >> 1, L = now << 1, R = L | 1;

	pushdown (now, mid, l, r, L, R);

	if (mid >= y)
		return find (L, l, mid, x, y);

	if (mid < x)
		return find (R, mid + 1, r, x, y);

	return (find (L, l, mid, x, mid) + find (R, mid + 1, r, mid + 1, y)) % mod;

}

int main () {

	ios::sync_with_stdio (0);

	cin.tie (0);

	cout.tie (0);

	cin >> n >> m;

	for (int i = 1; i <= n; ++ i)
		cin >> a[i];

	for (int i = 1; i <= n; ++ i)
		cin >> b[i];

	build (1, 1, n);

	while (m --) {

		cin >> op >> l >> r;

		if (op < 2)
			cin >> k, change1 (1, 1, n, l, r);
		else if (op < 3)
			cin >> k, change2 (1, 1, n, l, r);
		else
			cout << find (1, 1, n, l, r) << '\n';
//		if (! m) for (int len = 1; len <= n; ++ len) for (int l = 1, r = len; r <= n; ++ l, ++ r) cout << l << '~' << r << ':' << find (1, 1, n, l, r) << '\n';
	}

	return 0;

}
/*
5 2

1 3 5 6 8
3 1 2 1 2

1 2 5 3
3 1 3
*/
2024/6/9 00:01
加载中...