SP10707 COT2 - Count on a tree II

SP10707 COT2 - Count on a tree II

题意:

给定 n 个结点的树,每个结点有一种颜色。
m 次询问,每次询问给出 u,v,回答 u,v 之间的路径上的结点的不同颜色数。
1< = n < =4*10^4
1< = m < =10^5

题解:

树上莫队的裸题
但是裸题也是很难。。emm
我这里有比较详细的讲解
我大体总结一下就是:欧拉序实现树转为线性结构,然后在上面跑莫队
当然还要考虑v是u的子树,u和v不在一个子树等等各种情况
lca可以用树剖求,也可以lca
详细看代码

代码:

代码不是自己打的,等我把树剖复习完再重新打一遍

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <vector>
#define N 200000
using namespace std;
struct node
{int l,r,ll,rr,id,lca;
}q[N+5];
int n,m,a[N+5],st[N+5],ed[N+5],dfn[N+5],f[N+5],num,size[N+5],his[N+5],dep[N+5],son[N+5],top[N+5],c[N+5],tmp,block,l=1,r,use[N+5],ans[N+5],data[N+5];
vector <int> d[N+5];
void dfs1(int u,int fa)  //树剖第一次深搜
{f[u]=fa;st[u]=++num;size[u]=1;his[num]=u;dep[u]=dep[fa]+1;vector <int>::iterator it;for (it=d[u].begin();it!=d[u].end();it++){int v=(*it);if (v==fa)continue;dfs1(v,u);size[u]+=size[v];if (size[v]>size[son[u]])son[u]=v;}ed[u]=++num;his[num]=u;
}
void dfs2(int u,int to)   //树剖第二次深搜
{top[u]=to;if (son[u])dfs2(son[u],to);vector <int>::iterator it;for (it=d[u].begin();it!=d[u].end();it++){int v=(*it);if (v!=son[u]&&v!=f[u])dfs2(v,v);}
}
int Lca(int x,int y)   //树剖求lca
{while (top[x]!=top[y]){if (dep[top[x]]<dep[top[y]])swap(x,y);x=f[top[x]];}if (dep[x]>dep[y])swap(x,y);return x;
}
void add(int x)
{tmp+=(++c[a[x]]==1);
}
void del(int x)
{tmp-=(--c[a[x]]==0);
}
void calc(int x)     //对点进行加入或删除
{(use[x]==0)?add(x):del(x);use[x]^=1;
}
int cmp(node x,node y)   //排序
{return (x.ll==y.ll)?(x.ll%2==1?x.r<y.r:x.r>y.r):x.l<y.l;
}
int main()
{scanf("%d%d",&n,&m);for (int i=1;i<=n;i++)scanf("%d",&a[i]),data[i]=a[i];sort(data+1,data+n+1);for(int i=1;i<=n;i++)a[i]=lower_bound(data+1,data+n+1,a[i])-data;  //离散化int x,y;for (int i=1;i<n;i++){scanf("%d%d",&x,&y);d[x].push_back(y);d[y].push_back(x);}dfs1(1,0); dfs2(1,1);block=n*2/sqrt(m*2/3);for (int i=1;i<=m;i++){scanf("%d%d",&x,&y);if (st[x]>st[y])swap(x,y);  //保证stx<styq[i].id=i;q[i].lca=Lca(x,y);  if (q[i].lca==x)    //x,y在以x为根的子树中{q[i].l=st[x];q[i].r=st[y];q[i].ll=st[x]/block;q[i].rr=st[y]/block;q[i].lca=0;}else{q[i].l=ed[x];q[i].r=st[y];q[i].ll=ed[x]/block;q[i].rr=st[y]/block;}}sort(q+1,q+m+1,cmp);for (int i=1;i<=m;i++){while (l>q[i].l)calc(his[--l]);while (r<q[i].r)calc(his[++r]);while (l<q[i].l)calc(his[l++]);while (r>q[i].r)calc(his[r--]);if (q[i].lca)calc(q[i].lca);ans[q[i].id]=tmp;if (q[i].lca)calc(q[i].lca);}for (int i=1;i<=m;i++)printf("%d\n",ans[i]);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317832.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[CQOI2018]异或序列

[CQOI2018]异或序列 题意&#xff1a; 给定1个整数K&#xff0c;离线询问[l,r]中有多少子区间xor和K。 题解&#xff1a; 异或有个重要的性质&#xff1a;它的逆运算就是自身 我们维护该数列的前缀异或和a[x],表示1到x的区间异或和&#xff0c;这样问题就变成了在区间[l-1,…

ASP.NET Core 3.0:将会拥有更少的依赖

在ASP.NET Core项目中&#xff0c;我们使用一个叫做Microsoft.AspNetCore.App的综合包。它也被称为ASP.NET Core Shared Framework&#xff0c;在ASP.NET Core Shared Framework之中包含了很多依赖项&#xff0c;它能满足一般应用的需求。但是如果你查看它的依赖项&#xff0c;…

CSP2020洛谷P7077:函数调用

解析 没做出来… qwq 自己只能想到拓扑开vector把每个函数搞成一个奇怪的加法标记和乘法标记的结合 极限数据卡一卡还是nm的 得分纯玄学qwq 本题的关键是乘法相当于把函数调用多次 这样就可以利用和全是加法类似的策略拓扑统计每个函数的调用次数 使问题得以解决 要注意部分…

CF1616H Keep XOR Low(Trie 树上 DP)

CF1616H Keep XOR Low 给你 \(n\) 个整数 \(a_1,a_2,\cdots,a_n\) 和一个整数 \(x\)。 你需要求出 \(\{1,2,\cdots,n\}\) 的一个子集 \(S\)&#xff0c;满足 \(S\) 中任意两个不同的元素 \(i,j\)&#xff0c;满足 \(a_i~{\rm xor}~a_j\le x\)。 求选取 \(S\) 的方案数&#xff…

[UVA - 11865]Stream My Contest(最小树形图+朱刘算法)

本题过于简单&#xff0c;朱刘算法模板题&#xff0c;考虑二分一下带宽即可titlecodetitle code #include <cstdio> #include <cstring> #include <iostream> using namespace std; #define MAXN 65 #define MAXM 100005 #define int long long #define in…

CSP2021NOIP2021游记

CSP Day -? 初赛 初赛考前没怎么复习&#xff0c;反倒是理直气壮的翘了一周晚修&#xff08;虽然后面就一直翘了&#xff09;。 开考之后才发现要拿那几张纸&#xff0c;监考让我考完再出去拿。 选择题很简单&#xff0c;没有啥犹豫的写完了&#xff0c;第一道读程序写结果好…

P3226 [HNOI2012]集合选数(状压 DP)

P3226 [HNOI2012]集合选数 要求选出集合 \(S\) 满足如果 \(x\) 选择了&#xff0c;\(2x\) 和 \(3x\) 都不能选择。 求 \(\{1,2,\dots,n\}\) 的符合要求的子集数量。 \(n\le 10^5\)。 发现对所有除去 \(2,3\) 因子后不同的数&#xff0c;他们之间没有关联&#xff0c;完全可以分…

微软上线Try .NET,支持在浏览器运行C#代码

微软Try .NET项目近期上线&#xff0c;这一项目允许用户通过浏览器运行和编写C#代码&#xff0c;同时还支持完整的代码提示。用户可以通过访问这一项目官网&#xff08;点此进入&#xff09;对Try .NET这一项目进行简单了解。该项目允许开发人员在浏览器中运行和编辑C#代码片段…

第46届ICPC亚洲区域赛(沈阳)L-Perfect Matchings【dp,组合数学】

正题 题目链接:https://ac.nowcoder.com/acm/contest/24346/L 题目大意 有一张2n2n2n个点的完全图&#xff0c;在上面删除一棵生成树&#xff0c;然后求这张图的完全匹配方案数。 1≤n≤20001\leq n\leq 20001≤n≤2000 解题思路 考虑容斥&#xff0c;可以dpdpdp出fi,j,0/1f…

CSP2019洛谷P5666:树的重心

解析 毒题 细节有亿点点多 我一开始的思路是没有问题的 尝试统计有多少种方案能砍出大小在一个区间的子树、 当时的想法是线段树合并 但是这个玩意在需要保留原树的情况下空间复杂度炸没了… 因为我垃圾的实现一个dfs里面就玩了七遍merge函数… 空间常数飞起 然后分数就和暴力…

[LOJ]体育成绩统计 / Score (无脑模拟,没有脑子,就是上!)

题目 好久没敲过恶心的模拟题了&#xff0c;莫名有点怀念是什么鬼&#xff0c;我还记得我的zamjena 没啥想说的&#xff0c;这道题就是没智商有码力的 纯粹是纪念一下今天上午直接肝了的两个半小时&#xff0c;真的一点思维都不需要有&#xff0c;直接上&#xff01;&#xff0…

P7137 [THUPC2021 初赛] 切切糕(博弈 概率)

P7137 [THUPC2021 初赛] 切切糕 -> 双倍经验&#xff1a;Game on Sum (Hard Version) 有 \(n\) 块方蛋糕&#xff0c;绝顶聪明的 Sight 和 Sirrel 决定将每块蛋糕都分成两块各自品尝。Sight 会依次将每块蛋糕分成两块&#xff0c;而 Sirrel 有 \(m\) 次优先选择权。 对于 \(…

程序员修仙之路--设计一个实用的线程池

菜菜呀&#xff0c;我最近研究技术呢&#xff0c;发现线上一个任务程序线程数有点多呀CEO,CTO,CFO于一身的CXOx总&#xff0c;你学编程呢&#xff1f;菜菜作为公司总负责人&#xff0c;我以后还要管理技术部门呢&#xff0c;怎么能不会技术呢CEO,CTO,CFO于一身的CXO&#xff08…

Code Names

Code Names 题意&#xff1a; 如果一个字符串通过交换两个位置可以得到另一个字符串&#xff08;也就是两个字符串只有两个位置不一样且为交换关系&#xff09;&#xff0c;我们称这两个字符串为替代关系。 现在给出n个字符串&#xff0c;求一个集合&#xff0c;使得集合内的…

CSP2019洛谷P5665:划分(单调队列,高精度)

解析 自己写的时候写了二维单调队列优化的64分 一次过还是可以满意了啦 正解的关键结论是最优的方案的最后一段一定尽可能的短 原因嘛…显然 贪心的想&#xff0c;再最后一段的段首可以往前放的情况下肯定是要往前放的&#xff0c;这样代价更小&#xff0c;同时对后面的选取也…

P7962-[NOIP2021]方差【dp,差分】

正题 题目链接:https://www.luogu.com.cn/problem/P7962 题目大意 给出一个长度为nnn的序列aaa&#xff0c;你每次可以让一个ai(1<i<n)ai−1ai1−aia_i(1<i<n)a_{i-1}a_{i1}-a_iai​(1<i<n)ai−1​ai1​−ai​&#xff0c;求能变出的最小方差。 1≤n≤400,…

【2020牛客NOIP赛前集训营-提高组(第一场)题解】( 牛牛的方程式,牛牛的猜球游戏,牛牛的凑数游戏,牛牛的RPG游戏)

未完待续...T1&#xff1a;牛牛的方程式titlesolutioncodeT2&#xff1a;牛牛的猜数游戏titlesolutioncodeT3&#xff1a;牛牛的凑数游戏titlesolutioncodeT1&#xff1a;牛牛的方程式 title solution 因为浮点错误炸了70pts 这个三元一次不定方程呢&#xff0c;其实也没有…

[AGC041F] Histogram Rooks(神仙题 网格 容斥计数)

[AGC041F] Histogram Rooks 给定一个 \(N\) 行 \(N\) 列的棋盘&#xff0c;第 \(i\) 行只有 \([1,h_i]\) 是有格子的&#xff0c;其他都是虚空。 一个棋子放在一个格子上&#xff0c;我们称一个格子被一个棋子覆盖&#xff0c;仅当这个格子与这个棋子在同一行或同一列&#xff…

程序员修仙之路-数据结构之 CXO让我做一个计算器

菜菜呀&#xff0c;个税最近改革了&#xff0c;我得重新计算你的工资呀&#xff0c;我需要个计算器&#xff0c;你开发一个吧CEO,CTO,CFO于一身的CXOX总&#xff0c;咱不会买一个吗&#xff1f;菜菜那不得花钱吗&#xff0c;一块钱也是钱呀这个计算器支持加减乘除运算就行&…

2021年度训练联盟热身训练赛第一场

2021年度训练联盟热身训练赛第一场 文章目录D.Some Sum题意&#xff1a;题解&#xff1a;代码&#xff1a;F.Pulling Their Weight题意&#xff1a;题解&#xff1a;代码&#xff1a;H On Average Theyre Purple题意&#xff1a;题解&#xff1a;代码&#xff1a;J This Aint Y…