P5190 [COCI 2010] PROGRAM

很容易想到多次计算同一个 XiX_i 会浪费时间,不妨记录下每一个 XiX_i 出现的次数,然后用前缀和可以做到 O(1)O(1) 询问,O(nlogn)O(n \log n) 预处理。

代码:

#include <cstdio>
#include <iostream>
using namespace std;

#define int long long

const int N = 1e6 + 5;

int n, k, q, g, seq[N], presum[N];
int cnt[N];

signed main()
{
	scanf("%lld %lld", &n, &k);
	for (int i = 1; i <= k; i++)
	{
		scanf("%lld", &g);
		cnt[g]++;
	}
	for (int i = 0; i < n; i++)
	{
		if (!cnt[i]) continue;
		int p = i;
		for (int j = 0; j < n; j += p)
		{
			seq[j] += cnt[i];
		}
	}
	presum[0] = seq[0];
	for (int i = 1; i < n; i++) presum[i] = presum[i - 1] + seq[i];
	scanf("%lld", &q);
	while (q--)
	{
		int l, r;
		scanf("%lld %lld", &l, &r);
		printf("%lld\n", presum[r] - presum[l - 1]);
	}
	return 0;
}

顺便给个 5050 分的线段树吧,MLE 了。

代码:

#include <cstdio>
#include <iostream>
#include <unordered_map>
using namespace std;

#define int long long

const int N = 1e6 + 5;

int n, k, q, g, seq[N], ls[N], rs[N], now = 1;
int cnt[N];

struct Node
{
	int l, r, sum;
};

Node tree[N];

inline void push_up(int u)
{
	tree[u].sum = tree[ls[u]].sum + tree[rs[u]].sum;
}

inline void build(int u, int l, int r)
{
	tree[u] = { l, r };
	if (l == r)
	{
		tree[u].sum = seq[r];
		return;
	}
	int mid = (l + r) >> 1ll;
	if (!ls[u])
	{
		ls[u] = ++now;
	}
	if (!rs[u])
	{
		rs[u] = ++now;
	}
	build(ls[u], l, mid);
	build(rs[u], mid + 1ll, r);
	push_up(u);
}

inline int query(int u, int l, int r)
{
	if (tree[u].l >= l && tree[u].r <= r) return tree[u].sum;
	int mid = (tree[u].l + tree[u].r) >> 1ll, s = 0;
	if (l <= mid) s = query(ls[u], l, r);
	if (r > mid) s += query(rs[u], l, r);
	return s;
}

signed main()
{
	scanf("%lld %lld", &n, &k);
	for (int i = 1; i <= k; i++)
	{
		scanf("%lld", &g);
		cnt[g]++;
	}
	for (int i = 0; i < n; i++)
	{
		if (!cnt[i]) continue;
		int p = i;
		for (int j = 0; j < n; j += p)
		{
			seq[j] += cnt[i];
		}
	}
	build(1, 0, n - 1);
	scanf("%lld", &q);
	while (q--)
	{
		int l, r;
		scanf("%lld %lld", &l, &r);
		printf("%lld\n", query(1, l, r));
	}
	return 0;
}
posted @   HappyBobb  阅读(3)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示