求助P7334
  • 板块学术版
  • 楼主happybob
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/1/27 17:24
  • 上次更新2023/10/28 10:44:16
查看原帖
求助P7334
332914
happybob楼主2022/1/27 17:24
#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;

#define int long long

const int N = 3e5 + 5, MOD = 998244353;
int a[N], n, m, l, r;

struct Node
{
	int l, r, maxn, cnt;
};

Node tree[N << 2];

inline int quickpow(register int x, register int y)
{
	long long ans = 1, base = x;
	while (y)
	{
		if (y & 1)
		{
			ans *= base;
			ans %= MOD;
		}
		base *= base;
		base %= MOD;
		y >>= 1;
	}
	return ans;
}

inline void push_up(register int u)
{
	tree[u].maxn = max(tree[u << 1].maxn, tree[u << 1 | 1].maxn);
	tree[u].maxn %= MOD;
}

inline void push_down(int u)
{
	Node &root = tree[u], &left = tree[u << 1], &right = tree[u << 1 | 1];
	if (root.cnt)
	{
		left.cnt += root.cnt;
		left.maxn = quickpow(left.maxn, (root.cnt + 1));
		right.cnt += root.cnt;
		right.maxn = quickpow(right.maxn, (root.cnt + 1));
		root.cnt = 0;
	}
}

inline void build(register int u, register int l, register int r)
{
	tree[u].l = l, tree[u].r = r;
	if (l == r)
	{
		tree[u].maxn = a[r];
		tree[u].cnt = 0;
	}
	else
	{
		register int mid = l + r >> 1;
		build(u << 1, l, mid);
		build(u << 1 | 1, mid + 1, r);
		push_up(u);
	}
}

inline void modify1(register int u) // 开方
{
	if (tree[u].maxn <= 1) return;
	if (tree[u].l >= l && tree[u].r <= r && tree[u].l == tree[u].r)
	{
		tree[u].maxn = sqrt(tree[u].maxn * 1.0);
		return;
	}
	push_down(u);
	int mid = tree[u].l + tree[u].r >> 1;
	if (l <= mid) modify1(u << 1);
	if (r > mid) modify1(u << 1 | 1);
	push_up(u);
}

inline void modify2(register int u)
{
	if (tree[u].l >= l && tree[u].r <= r)
	{
		tree[u].cnt++;
		tree[u].maxn = quickpow(tree[u].maxn, 2);
	}
	else
	{
		push_down(u);
		int mid = tree[u].l + tree[u].r >> 1;
		if (l <= mid) modify2(u << 1);
		if (r > mid) modify2(u << 1 | 1);
		push_up(u);
	}
}

inline int query(register int u)
{
	if (tree[u].l == tree[u].r && tree[u].l >= l && tree[u].r <= r) return tree[u].maxn;
	push_down(u);
	int mid = tree[u].l + tree[u].r >> 1, s = 0;
	if (l <= mid) s = query(u << 1);
	s %= MOD;
	if (r > mid) s += query(u << 1 | 1);
	s %= MOD;
	return s;
}

signed main()
{
	scanf("%lld %lld", &n, &m);
	for (int i = 1; i <= n; i++) scanf("%lld", &a[i]);
	build(1, 1, n);
	while (m--)
	{
		int opt;
		scanf("%lld %lld %lld", &opt, &l, &r);
		if (opt == 1) modify1(1);
		else modify2(1);
	}
	l = 1, r = n;
	printf("%lld\n", query(1));
	return 0;
}

只有 1010 分,好多都是WA。

2022/1/27 17:24
加载中...