CF474F Ant colony
简略题意
给定一个
解法
给一个离线解法。
第一步,
首先考虑
维护完之后明显要求
总结起来,我们对每次询问计算
接着分析复杂度:
线段树维护的复杂度是
复杂度好像很大,但是最慢的点也就三百多毫秒,轻松通过。
不得不说有紫题的难度。
代码:
#pragma GCC optimize(2)
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <utility>
#include <unordered_map>
using namespace std;
const int N = 1e5 + 5;
inline int gcd(int a, int b)
{
return (b == 0 ? a : gcd(b, a % b));
}
int ans[N], a[N], b[N], n, m, len, cntk[N], real[N];
unordered_map<int, bool> mp;
struct Node
{
int l, r, gcdn;
}tree[N << 2];
inline void push_up(int u)
{
tree[u].gcdn = gcd(tree[u << 1].gcdn, tree[u << 1 | 1].gcdn);
}
inline void build(int u, int l, int r)
{
tree[u] = { l, r };
if (l == r) tree[u].gcdn = real[a[r]];
else
{
int mid = (l + r) >> 1;
build(u << 1, l, mid);
build(u << 1 | 1, mid + 1, 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].gcdn;
int mid = (tree[u].l + tree[u].r) >> 1;
int k = 0;
if (l <= mid)
{
k = query(u << 1, l, r);
}
if (r > mid)
{
k = gcd(k, query(u << 1 | 1, l, r));
}
return k;
}
struct Nodeq
{
int rid, l, r, gcdn;
bool operator<(const Nodeq& g) const
{
int i = l / len, j = g.l / len;
return (i ^ j ? i < j : i & 1 ? r < g.r : r > g.r);
}
}q[N];
inline void add(int x)
{
++cntk[a[x]];
}
inline void del(int x)
{
--cntk[a[x]];
}
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; ++i)
{
scanf("%d", &a[i]);
b[i] = a[i];
mp[a[i]] = true;
}
sort(b + 1, b + n + 1);
int place = unique(b + 1, b + n + 1) - b - 1;
for (register int i = 1; i <= n; ++i)
{
int k = a[i];
a[i] = lower_bound(b + 1, b + place + 1, a[i]) - b + 1;
real[a[i]] = k;
}
build(1, 1, n);
scanf("%d", &m);
for (register int i = 1; i <= m; ++i)
{
register int l, r;
scanf("%d %d", &l, &r);
int qp = query(1, l, r);
q[i] = { i, l, r, qp };
}
len = sqrt(m);
sort(q + 1, q + m + 1);
register int nl = 1, nr = 0;
for (register int i = 1; i <= m; ++i)
{
int l = q[i].l, r = q[i].r;
while (nl < l) del(nl++);
while (nl > l) add(--nl);
while (nr < r) add(++nr);
while (nr > r) del(nr--);
if (!mp[q[i].gcdn]) ans[q[i].rid] = r - l + 1;
else ans[q[i].rid] = (r - l + 1) - cntk[lower_bound(b + 1, b + place + 1, q[i].gcdn) - b + 1];
}
for (register int i = 1; i <= m; ++i) printf("%d\n", ans[i]);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现