社区讨论

ATcoder F 求调

学术版参与者 2已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@lx7f51xz
此快照首次捕获于
2024/06/09 18:45
2 年前
此快照最后确认于
2024/06/09 21:15
2 年前
查看原帖
CPP
#include <bits/stdc++.h>

using i64 = long long;
using i128 = __int128;
using pii = std::pair< int, int >;

#define fi first
#define se second
#define pb push_back
#define ma make_pair
#define int long long
#define eb emplace_back
#define all(x) x.begin(), x.end()
#define fup(x, l, r) for (int x = (l), eNd = (r); x <= eNd; ++ x )
#define fdw(x, r, l) for (int x = (r), eNd = (l); x >= eNd; -- x )

struct fastread {
	template <typename T>
	fastread& operator >>(T& x) {
		x = 0; bool flg = false; char c = getchar();
		while (c < '0' || c > '9') flg |= (c == '-'), c = getchar();
		while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + c - '0', c = getchar();
		if (flg) x = -x; return *this;
	}
	template <typename T>
	fastread& operator >>(std::vector<T>& x) {
		for (auto it = x.begin(); it != x.end(); ++ it ) (*this) >> *it;
		return *this;
	}
}fin;

struct fastwrite {
	template <typename T>
	fastwrite& operator <<(T x) {
		if (x < 0) x = -x, putchar('-');
		static int buf[35]; int top = 0;
		do buf[top ++ ] = x % 10, x /= 10; while (x);
		while (top) putchar(buf[ -- top] + '0');
		return *this;
	}
	fastwrite& operator <<(char x) {
		putchar(x); return *this;
	}
	template <typename T>
	fastwrite& operator <<(std::vector<T> x) {
		for (auto it = x.begin(); it != x.end(); ++ it ) (*this) << *it, putchar(' ');
		putchar('\n');
		return *this;
	}
}fout;

const int N = 1e6 + 10;
const int mod = 998244353;

struct tree
{
	int l, r;
	int suma, sumb;
	int lza, lzb;
	int mul;
} tr[N << 2];
int l, r, n;
int a[N], b[N];

struct Segment_Tree
{
	#define ls (rt << 1)
	#define rs (rt << 1 | 1)
	void pushup(int rt)
	{
		//code
		tr[rt].suma = (tr[ls].suma + tr[rs].suma) % mod;
		tr[rt].sumb = (tr[ls].sumb + tr[rs].sumb) % mod;
		tr[rt].mul = (tr[ls].mul + tr[rs].mul) % mod;
	}
	void pushdown(int rt)
	{
		int mid = (tr[rt].l + tr[rt].r) >> 1;
		//code
		tr[ls].lza += tr[rt].lza;
		tr[ls].lza %= mod;
		tr[rs].lza += tr[rt].lza;
		tr[rs].lza %= mod;
		
		tr[ls].lzb += tr[rt].lzb;
		tr[ls].lzb %= mod;
		tr[rs].lzb += tr[rt].lzb;
		tr[rs].lzb %= mod;
		
		tr[ls].suma += (mid - tr[rt].l + 1) * tr[rt].lza;
		tr[ls].suma %= mod;
		tr[rs].suma += (r - mid) * tr[rt].lza;
		tr[rs].suma %= mod;
		
		tr[ls].sumb += (mid - tr[rt].l + 1) * tr[rt].lzb;
		tr[ls].sumb %= mod;
		tr[rs].sumb += (r - mid) * tr[rt].lzb;
		tr[rs].sumb %= mod;
		
		tr[ls].mul = (tr[ls].mul + (tr[rt].lza * tr[ls].sumb) % mod + (tr[rt].lzb * tr[ls].suma) % mod) % mod;
		tr[rs].mul = (tr[rs].mul + (tr[rt].lza * tr[rs].sumb) % mod + (tr[rt].lzb * tr[rs].suma) % mod) % mod;
		
		tr[rt].lza = 0;
		tr[rt].lzb = 0;
	}
	void build(int rt, int l, int r)
	{
		tr[rt].l = l, tr[rt].r = r;
		if(l == r)
		{
			//code
			tr[rt].suma = a[l];
			tr[rt].sumb = b[l];
			tr[rt].mul = (a[l] * b[l]) % mod;
			return ;
		}
		int mid = (l + r) >> 1;
		build(ls, l, mid);
		build(rs, mid + 1, r);
		pushup(rt);
	}
	void update1(int rt, int l, int r, int v)
	{
		if(tr[rt].l >= l && tr[rt].r <= r)
		{
			//code
			tr[rt].suma += (tr[rt].r - tr[rt].l + 1) * v;
			tr[rt].suma %= mod;
			tr[rt].lza += v;
			tr[rt].lza %= mod;
			tr[rt].mul += v * tr[rt].sumb;
			tr[rt].mul %= mod;
			return ;
		}
		pushdown(rt);
		int mid = (tr[rt].l + tr[rt].r) >> 1;
		if(l <= mid)		update1(ls, l, r, v);
		if(r > mid)		update1(rs, l, r, v);
		pushup(rt);
	}
	void update2(int rt, int l, int r, int v)
	{
		if(tr[rt].l >= l && tr[rt].r <= r)
		{
			//code
			tr[rt].sumb += (tr[rt].r - tr[rt].l + 1) * v;
			tr[rt].sumb %= mod;
			tr[rt].lzb += v;
			tr[rt].lzb %= mod;
			tr[rt].mul += v * tr[rt].suma;
			tr[rt].mul %= mod;
			return ;
		}
		pushdown(rt);
		int mid = (tr[rt].l + tr[rt].r) >> 1;
		if(l <= mid)		update2(ls, l, r, v);
		if(r > mid)		update2(rs, l, r, v);
		pushup(rt);
	}
	int query(int rt, int l, int r)
	{
		if(tr[rt].l >= l && tr[rt].r <= r)
		{
			//code
			return tr[rt].mul;
		}
		pushdown(rt);
		int mid = (tr[rt].l + tr[rt].r) >> 1;
		int res = 0;
		if(l <= mid)
		{
			//code
			res = query(ls, l, r);
			res %= mod;
		}
		if(r > mid)
		{
			//code
			res += query(rs, l, r);
			res %= mod;
		}
		return res % mod;
	}
	#undef ls
	#undef rs
} T;

signed main(void)
{
	std::ios::sync_with_stdio(false);
	std::cin.tie(0);
	std::cout.tie(0);
	int q;
	fin >> n >> q;
	fup(i, 1, n) fin >> a[i], a[i] %= mod;
	fup(i, 1, n) fin >> b[i], b[i] %= mod;;
	T.build(1, 1, n);
	while (q--)
	{
		int op, x;
		fin >> op >> l >> r;
		if(op == 1)
		{
			fin >> x;
			x %= mod;
			T.update1(1, l, r, x);
		}
		else if(op == 2)
		{
			fin >> x;
			x %= mod;
			T.update2(1, l, r, x);
		}
		else
		{
			fout << T.query(1, l, r) << '\n';
		}
	}
	return 0;
}



回复

5 条回复,欢迎继续交流。

正在加载回复...