社区讨论
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 条回复,欢迎继续交流。
正在加载回复...