当前位置: 首页 > news >正文

SPOJ COT2 - Count on a tree II 题解 树上莫队

题目链接:

  1. https://www.luogu.com.cn/problem/SP10707 (spoj 的 remote judge好像也不行了,但是可以看中文题面)
  2. https://www.spoj.com/problems/COT2/ SPOJ官网题面(英文,可提交)

求 欧拉序,得到一个长度为 \(2n\) 的欧拉序列;

然后在 欧拉序 上进行莫队。

示例程序:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 4e4 + 5, maxm = 1e5 + 5;int n, m, blo, a[maxn], fa[maxn][16], dep[maxn], id[maxn * 2], idx, dfn[maxn], nfd[maxn], ans[maxm], sum;
vector<int> g[maxn];void lsh() {vector<int> v(a+1, a+n+1);sort(v.begin(), v.end());v.erase(unique(v.begin(), v.end()), v.end());for (int i = 1; i <= n; i++)a[i] = lower_bound(v.begin(), v.end(), a[i]) - v.begin() + 1;
}void dfs(int u, int p) {id[ dfn[u] = ++idx ] = u;dep[u] = dep[p] + 1;fa[u][0] = p;for (auto v : g[u])if (v != p)dfs(v, u);id[ nfd[u] = ++idx ] = u;
}int lca(int x, int y) {if (dep[x] < dep[y])swap(x, y);for (int i = 15; i >= 0; i--) {int p = fa[x][i];if (dep[p] >= dep[y])x = p;}if (x == y)return x;for (int i = 15; i >= 0; i--)if (fa[x][i] != fa[y][i])x = fa[x][i], y = fa[y][i];return fa[x][0];
}struct Query {int id, l, r;
} query[maxm];bool vis[maxn];
int cnt[maxn];void add(int x) {int u = id[x];if (!vis[u]) {if (++cnt[ a[u] ] == 1) sum++;}else {if (--cnt[ a[u] ] == 0) sum--;}vis[u] ^= 1;
}int main() {scanf("%d%d", &n, &m);blo = sqrt(n * 2);for (int i = 1; i <= n; i++)scanf("%d", a+i);lsh();for (int i = 1, u, v; i < n; i++) {scanf("%d%d", &u, &v);g[u].push_back(v);g[v].push_back(u);}dfs(1, 0);for (int i = 1; i <= 15; i++)for (int u = 1; u <= n; u++)fa[u][i] = fa[ fa[u][i-1] ][i-1];for (int i = 1, u, v, l, r; i <= m; i++) {scanf("%d%d", &u, &v);if (dfn[u] > dfn[v])swap(u, v);int z = lca(u, v);if (z != u && z != v)query[i] = {i, nfd[u], dfn[v]};elsequery[i] = {i, dfn[u], dfn[v]};}sort(query+1, query+m+1, [](auto a, auto b) {if (a.l / blo != b.l / blo)return a.l < b.l;return (a.l / blo % 2) ? (a.r < b.r) : (a.r > b.r);});for (int i = 1, l = 1, r = 0; i <= m; i++) {while (l < query[i].l) add(l++);while (l > query[i].l) add(--l);while (r < query[i].r) add(++r);while (r > query[i].r) add(r--);int u = id[l], v = id[r], z = lca(u, v);if (z == u || z == v) {ans[ query[i].id ] = sum;}else {add(dfn[z]);ans[ query[i].id ] = sum;add(dfn[z]);}}for (int i = 1; i <= m; i++)printf("%d\n", ans[i]);return 0;
}
http://www.jsqmd.com/news/438598/

相关文章:

  • 告别进口依赖!这家国产废气处理设备品牌以核心技术打破垄断 - 品牌推荐大师1
  • 银座购物卡回收价格如何,回收三步完成 - 京回收小程序
  • 全球沉浸式互娱行业看中国,中国沉浸式互娱建设看雾隐门 - 博客万
  • 如何快速回收盒马鲜生礼品卡变现?全流程指南 - 团团收购物卡回收
  • MySQL全方位加密与安全加固实战:从存储、列级到传输加密的深度实践
  • 2026西安升学职高Top5深度测评:万象、大唐、现代谁是升学“天花板”? - 深度智识库
  • 2026年评价高的瓷砖粘接剂品牌推荐:瓷砖粘贴剂/瓷砖胶强力粘合剂厂家精选 - 品牌宣传支持者
  • 对比一圈后,AI论文平台千笔 VS 锐智 AI,专科生首选!
  • 闲置百联OK卡如何回收?教你快速变现技巧! - 团团收购物卡回收
  • 【亲测可用】Xshell下载安装全攻略:官方Xshell安装包安全下载+详细安装步骤图解 - sdfsafafa
  • 2026 雅思学习线上机构 TOP5 精选排名:留学申请速选 - 速递信息
  • 中石油不记名加油卡回收热门途径解析 - 京回收小程序
  • 百联OK卡回收方法详解,轻松解决闲置卡片! - 团团收购物卡回收
  • 分享2026年燃气发电机组供应企业服务周到的优质选择 - 工业设备
  • 损失函数大集合
  • 2026刀具推荐干货:王麻子内置磨刀器设计,刀具持久锋利不用愁 - 速递信息
  • 4天搞定MOS认证--Excel专家级,我只教一次!
  • Drawio下载和安装图解教程(附安装包,2026实测) - sdfsafafa
  • 谁懂啊!闲置京东e卡真的能逼疯普通人 - 团团收购物卡回收
  • 2026沧州最新防水补漏服务商TOP5评测!权威榜单发布 - 十大品牌榜
  • 2026年2月,好用的去油去屑洗发水牌子你知道几个?,去屑洗发水/止痒去屑洗发水,去油去屑洗发水品牌口碑推荐榜 - 品牌推荐师
  • 船用柴油发电机组厂家哪家靠谱,2026年度优质推荐 - 工业推荐榜
  • 中电金信:以高效运维驱动精细运营,构建服务管控新体系
  • 2026 最新查漏服务商/厂家 TOP5 评测!权威榜单发布,精准守护建筑安全 - 十大品牌榜
  • 2026年想选北大青鸟海淀校区,怎么选择不踩坑 - mypinpai
  • 北京口碑好的不锈钢制品定制生产厂,合作案例多的有推荐吗? - 工业设备
  • 002:RAG 入门-LangChain 读取文本
  • 图排列 笔记
  • 2026最新青岛补漏服务商/厂家TOP5评测!权威榜单发布,专业守护建筑安全 - 十大品牌榜
  • 航空ETF汇添富(159257.SZ)放量上涨资金分化显现