线段树wa 0pts求调
查看原帖
线段树wa 0pts求调
486799
BlackPanda楼主2024/4/27 16:48
#include <bits/stdc++.h>
using namespace std;

#define ios_close ios::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL)
#define yes puts("Yes")
#define no puts("No")
#define lowbit(x) (x) & (-x)
#define inf 0x3f3f3f3f
#define endl "\n"
#define PII pair<int, int>
typedef long long LL;

const int MOD = 1e9 + 7;
const int N = 1e5 + 10;

int n, m, a[N];

/*====================*/

struct MatrixValu
{
	int M[4][2];
	MatrixValu()
	{
		memset(M, 0, sizeof M);
	}
	friend MatrixValu operator + (const MatrixValu& a, const MatrixValu& b)
	{
		MatrixValu c;
		for (int i = 1; i <= 3; i++)
			for (int j = 1; j <= 1; j++)
				c.M[i][j] = (a.M[i][j] + b.M[i][j]) % MOD;
		return c;
	}
};

struct Tree
{
	int l, r;
	MatrixValu valu;
} tree[N << 2];

int ls(int p) { return p << 1; }
int rs(int p) { return p << 1 | 1; }

void PushUp(int p)
{
	tree[p].valu = tree[ls(p)].valu + tree[rs(p)].valu;
}

void Build(int p, int l, int r)
{
	tree[p].l = l; tree[p].r = r;
	if (tree[p].l == tree[p].r)
	{
		tree[p].valu.M[1][1] = a[l] % MOD;
		tree[p].valu.M[2][1] = a[l] % MOD * a[l] % MOD;
		tree[p].valu.M[3][1] = 1;
	}
	else
	{
		int mid = (tree[p].l + tree[p].r) >> 1;
		Build(ls(p), l, mid + 0);
		Build(rs(p), mid + 1, r);
		PushUp(p);
	}
}

void Change(int p, int x)
{
	if (tree[p].l == tree[p].r)
	{
		tree[p].valu.M[1][1] = x % MOD;
		tree[p].valu.M[2][1] = x % MOD * x % MOD;
	}
	else
	{
		int mid = (tree[p].l + tree[p].r) >> 1;
		if (x <= mid)Change(ls(p), x);
		if (x > mid) Change(rs(p), x);
		PushUp(p);
	}
}

int Ask(int p, int l, int r, bool f)
{
	if (l <= tree[p].l && tree[p].r <= r)
	{
		return f ? tree[p].valu.M[1][1] : tree[p].valu.M[2][1];	// 1: 区间和 0: 平方和
	}
	else
	{
		int res = 0;
		int mid = (tree[p].l + tree[p].r) >> 1;
		if (l <= mid)(res += Ask(ls(p), l, r, f) % MOD) %= MOD;
		if (r > mid) (res += Ask(rs(p), l, r, f) % MOD) %= MOD;
		return res % MOD;
	}
}

int qpow(int a, int b, int p)
{
	if (!b)	return 1;
	if (b % 2 == 0)
	{
		LL t = qpow(a, b / 2, p) % p;
		return t % p * t % p;
	}
	LL t = qpow(a, b - 1, p) % p;
	return t % p * a % p;
}

/*====================*/

void Solve()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i]; a[i] %= MOD;
	}
	Build(1, 1, n);
	while (m--)
	{
		int op, x, y;
		cin >> op >> x >> y;
		if (op == 1)
		{
			Change(x, y);
		}
		else
		{
			int inv = qpow(y - x + 1, MOD - 2, MOD) % MOD;
			int res1 = Ask(1, x, y, 0) % MOD;	// 平方和
			int res2 = Ask(1, x, y, 1) % MOD;	// 区间和
			int ave = inv % MOD * res2 % MOD; // 平均数
			int ans = (inv % MOD * res1 % MOD - ave % MOD * ave % MOD) % MOD;
			cout << (ans % MOD + MOD) % MOD << endl;
		}
	}
	return;
}

/*====================*/

signed main()
{
#ifndef ONLINE_JUDGE
	freopen("IN.txt", "r+", stdin);
#endif
	ios_close;
	int _ = 1; // cin >> _;
	while (_--)
		Solve();
	return 0;
}
2024/4/27 16:48
加载中...