P9994 [Ynoi Easy Round 2024] TEST_132 题解

1212 秒,范围 10610^6,猜测可能是根号算法。

考虑根号分治。设阈值为 BB,对于修改操作,如果涉及修改的点数 B\leq B,直接暴力修改并维护 sumysum_y 表示 yi=yy_i=y 的点在暴力操作下的点权和。否则打标记,维护这种 xx 平方了多少次,例如两次平方相当于四次方,三次相当于八次方。根据费马小定理将这个次数对 109+610^9+6 取模。

询问时,至多 nB\dfrac{n}{B}xx 需要重新计算,计算时用快速幂处理即可。

B=3000B=3000 可以通过。

#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <string>
#include <cmath>
#include <vector>
using namespace std;

const int N = 1e6 + 5;
constexpr long long MOD = 1e9 + 7;

int n, m, x[N], y[N];
long long v[N];
vector<pair<int, long long>> p[N];
vector<pair<int, int>> p2[N];

long long tag[N];
const int B = 3000;
long long sum[N];

long long qpow(long long a, long long b)
{
	long long res = 1LL, base = a;
	while (b)
	{
		if (b & 1LL)
		{
			res = res * base % MOD;
		}
		base = base * base % MOD;
		b >>= 1LL;
	}
	return res;
}

namespace FastIO
{
	char* p1, * p2, buf[1 << 14];
#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, (1 << 14), stdin), p1 == p2) ? EOF : *p1++)

	template <typename T>
	inline void read(T& x)
	{
		x = 0;
		char ch = getchar();
		while (ch < '0' || ch > '9') {
			ch = getchar();
		}
		while (ch >= '0' && ch <= '9') {
			x = (x << 1) + (x << 3) + (ch ^ 48);
			ch = getchar();
		}
	}

	template <typename T>
	void write(T x) {
		if (x < 0) {
			putchar('-');
			x = -x;
		}
		if (x > 9) write(x / 10);
		putchar(x % 10 ^ 48);
	}

	template <typename T>
	inline void writeln(T x, char sep = '\n') {
		write(x);
		putchar(sep);
	}
}

int main()
{
	FastIO::read(n), FastIO::read(m);
	for (int i = 0; i < N; i++) tag[i] = 1LL;
	for (int i = 1; i <= n; i++)
	{
		FastIO::read(x[i]), FastIO::read(y[i]), FastIO::read(v[i]);
		p[x[i]].emplace_back(make_pair(y[i], v[i]));
	}
	for (int i = 1; i <= n; i++)
	{
		if (p[x[i]].size() <= B) sum[y[i]] = (sum[y[i]] + v[i]) % MOD;
		else p2[y[i]].emplace_back(make_pair(x[i], v[i]));
	}
	while (m--)
	{
		int op;
		FastIO::read(op);
		if (op == 1)
		{
			int x;
			FastIO::read(x);
			if (p[x].size() <= B)
			{
				for (auto& [y, v] : p[x])
				{
					sum[y] = (sum[y] - v + MOD) % MOD;
					v = (v * v) % MOD;
					sum[y] = (sum[y] + v) % MOD;
				}
			}
			else
			{
				tag[x] = (tag[x] << 1LL) % (MOD - 1LL);
			}
		}
		else
		{
			int y;
			FastIO::read(y);
			long long ans = sum[y];
			for (auto& [x, v] : p2[y])
			{
				ans = (ans + qpow(v, tag[x])) % MOD;
			}
			FastIO::writeln(ans);
		}
	}
	return 0;
}
posted @   HappyBobb  阅读(11)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示