codeforces1467 E. Distinctive Roots in a Tree(树上差分)

E. Distinctive Roots in a Tree

树上差分

  • 如果当前节点u的某一棵子树中的某个节点的值和当前节点相同,那么除了当前节点这一棵子树节点,其他节点(其他子树以及u上面的节点)一定不满足要求。

  • 如果当前节点子树之外的节点(u上面的节点)与当前节点值相同,那么当前子树节点不满足要求。

如何知道当前子树中的节点是否与当前节点相同?
dfs过程中记录进入该子树之前某值的个数与出子树后该值的个数进行比较,如果比之前多,说明子树中存在该值。

如何知道当前节点所有子树之外的节点是否存在与当前值相同的节点?
如果不存在,说明当前节点所有子树出现该值个数和应该与总个数相同

对于不能作为答案的节点标记一下即可,由于只有子树操作考虑dfs序,区间修改单点查询差分即可。

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<set>
#include<map>
#include<cmath>
#include<stack>
#include<queue>
#include<random>
#include<bitset>
#include<string>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<unordered_map>
#include<unordered_set>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N=200010,mod=1e9+7;
int h[N],e[2*N],ne[2*N],idx;
int a[N],cnt[N],num[N],s[N],n;
map<int,int> mp;
int find(int x)
{if(!mp.count(x)) mp[x]=++idx;return mp[x];
}
void add(int a,int b)
{e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void update(int l,int r,int x)
{s[l]+=x,s[r+1]-=x;
}
int dfn[N],timestamp,sz[N];
void dfs(int u,int fa)
{dfn[u]=++timestamp;sz[u]=1;int now=cnt[a[u]];// 差分统计u子树出现a[u]的次数cnt[a[u]]++;for(int i=h[u];i!=-1;i=ne[i]){int j=e[i];if(j==fa) continue;int pre=cnt[a[u]];//进入子树前dfs(j,u);sz[u]+=sz[j];if(cnt[a[u]]>pre) //说明j子树出现了a[u]update(1,n,1),update(dfn[j],dfn[j]+sz[j]-1,-1);}if(cnt[a[u]]-now!=num[a[u]])//差分统计u子树出现a[u]的次数 不等于总个数update(dfn[u],dfn[u]+sz[u]-1,1);//1表示不能作为答案}
int main()
{IO;int T=1;//cin>>T;while(T--){memset(h,-1,sizeof h);cin>>n;for(int i=1;i<=n;i++) {cin>>a[i];a[i]=find(a[i]);num[a[i]]++;//总个数}idx=0;for(int i=1;i<n;i++){int a,b;cin>>a>>b;add(a,b),add(b,a);}dfs(1,-1);int res=0;for(int i=1;i<=n;i++){s[i]+=s[i-1];if(!s[i]) res++;}cout<<res<<'\n';}return 0;
}

要加油哦~

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

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

相关文章

【图论】旅行者(P5304)

正题 P5304 题目大意 给你一个有向图以及k个关键点&#xff0c;问你关键点之间最短路距离的最小值 解题思路 考虑两个不同点二进制下必定有一位不同 枚举每一位&#xff0c;把该位为1的作为起点跑最短路&#xff0c;然后对于每个为0的点计算答案&#xff0c;反过来同理 时…

c# 弹性和瞬态故障处理库Polly 学习

关于PollyPolly是一个基于.NET的弹性及瞬态故障处理库,允许开发人员以顺畅及线程安全的方式执行重试(Retry)、断路(Circuit Breaker)、超时(Timeout)、隔离(Bulkhead Isolation)和回退策略(Fallback ).Polly适用于 .NET 4.0, .NET 4.5 和.NET Standard 1.1。以上是官方文档对po…

CF444C-DZY Loves Colors【线段树,set】

正题 题目链接:https://www.luogu.com.cn/problem/CF444C 题目大意 nnn个物品第iii个颜色为iii&#xff0c;权值为000。要求支持mmm次操作 给出l,r,xl,r,xl,r,x&#xff0c;对于所有区间[l,r][l,r][l,r]中的物品&#xff0c;如果颜色为ccc&#xff0c;那么该位置的权值加上∣…

codeforces1473 E.Minimum Path(分层图最短路)

E - Minimum Path 分层图最短路 第一个分层图 第0层就是按照题中给的点连边&#xff0c;从第0层到第1层我们连一条边权是0的边&#xff0c;从第1层到第2层连一条边权是原先边权2倍的边&#xff0c;当然第1层以及第2层之间按照原图连边。 第二个分层图 第0层就是按照题中给的点…

【博弈】取石子游戏(P2599)

正题 P2599 题目大意 给n堆石子&#xff0c;第 i 堆有 aia_iai​ 个石子&#xff0c;每次可以从最左边或者最右边的一堆里面取若干个&#xff0c;两个人轮流取&#xff0c;问先手是否存在必胜策略 解题思路 设 li,jl_{i,j}li,j​ 为在 [i,j][i,j][i,j] 右边添加一堆大小 li,…

2020牛客国庆集训派对day8

牛客网链接 文章目录Easy Chess题意&#xff1a;题解&#xff1a;Easy Problemset题意题解&#xff1a;Shuffle Cards题解&#xff1a;Diff-prime Pairs题意题解&#xff1a;代码&#xff1a;Easy Chess 题意&#xff1a; 通过n步从左下角走到右上角&#xff0c;每次移动都是…

TechEmpower最新一轮的性能测试出炉,ASP.NET Core依旧表现不俗

TechEmpower在10月30发布最新一轮&#xff08;Round 17&#xff09;针对“Web Framework Benchmarks”的性能测试报告&#xff0c;ASP.NET Core依旧表现不俗&#xff0c;在一些指标上甚至是碾压其他主流Web框架。为此我们做了一个简单的统计&#xff0c;看看ASP.NET Core和其他…

P6076-[JSOI2015]染色问题【组合数学,容斥】

正题 题目链接:https://www.luogu.com.cn/problem/P6076 题目大意 给出n∗mn*mn∗m的网格&#xff0c;ccc种颜色涂色要求 每个格子可以染色也可以不染每一行每一列至少有一个格子被染每个颜色至少用一次 1≤n,m,c≤4001\leq n,m,c\leq 4001≤n,m,c≤400 解题思路 一个比较简…

E - Escape from the Island(最短路+dp)

E - Escape from the Island 大佬题解&#xff0c;码风真的爱了 状态表式&#xff1a;f(u,j)f(u,j)f(u,j)当前在uuu点&#xff0c;已经划了jjj步时离终点的最短距离 状态转移&#xff1a; 主动划一步min&#xff0c;转移到下一个点vvv f(u,j)f(v,j1)1,(u,v)∈E,(u,v)∈Ef(u,j…

国内开源社区巨作AspectCore-Framework入门

前些天和张队(善友),lemon(浩洋),斌哥(项斌)等MVP大咖一块儿吃饭,大家聊到了lemon名下的AOP这个项目,我这小白听得一脸懵逼,后面回来做了一下功课,查了下资料,在lemon的Github上把这个项目学习了一下,收获颇丰,让我这个没有接触过AOP的Coder叹为观止,陷入了对lemon的深深崇拜,在…

【数论】Product(P5221)

正题 P5221 题目大意 求 ∏i1n∏j1nlcm(i,j)gcd(i,j)\prod_{i1}^n\prod_{j1}^n\frac{lcm(i,j)}{gcd(i,j)}i1∏n​j1∏n​gcd(i,j)lcm(i,j)​ 解题思路 ∏i1n∏j1nlcm(i,j)gcd(i,j)\prod_{i1}^n\prod_{j1}^n\frac{lcm(i,j)}{gcd(i,j)}i1∏n​j1∏n​gcd(i,j)lcm(i,j)​ ∏i1n∏…

STL的可持久化数组

rope是一种可持久化数组&#xff0c;可持久化平衡树&#xff0c;采用块状链表实现 #include<ext/rope> using namespace __gnu_cxx; rope<int>a;rope就是一个用可持久化平衡树实现的“重型”string 库中模板计算基本和string一样简单 各种操作的复杂度都是O(log…

HarmonyOs4.0基础(一)

目录 一、HarmonyOs系统定义 1.1系统的技术特性(三大特征) 1.1.1、硬件互助、资源共享 1.1.2、一次开发、多端部署(面向开发者) 1.1.3、统一OS&#xff0c;弹性部署(支持多种API&#xff1a;ArkTs、JS、C/C、Java) 1.2、系统的技术架构 二、Harmony OS项目搭建 2.1、(D…

P4643-[国家集训队]阿狸和桃子的游戏【结论】

正题 题目链接:https://www.luogu.com.cn/problem/P4643 题目大意 给出nnn个点mmm条边的无向图&#xff0c;两个人轮流选择一个未被选择的点加入点集。 然后每个人的权值为选出的点的导出子图点权加边权和。 两个人都希望自己的权值减去对方的权值最大 求先手的权值减去后…

C. Code a Trie(Trie+dfs+贪心)

C. Code a Trie 大佬题解&#xff0c;代码基本就是抄的 对于每一个值计算所有串的LCA&#xff0c;也就是最长公共前缀&#xff0c;将该节点&#xff08;Trie树的节点&#xff09;标记&#xff0c;对于这些字符串在LCA下面的点一定不存在&#xff08;如果存在他们不会返回相同…

swagger文档转换为WebApiClient声明式代码

1 swagger简介Swagger是一个规范且完整的框架&#xff0c;提供描述、生产、消费和可视化RESTful Web Service。其核心是使用json来规范描述RESTful接口&#xff0c;另外有提供UI来查看接口说明&#xff0c;并有一套生成不同语言的客户端调用代码生成器。1.1 对Api提供者自顶向下…

Musical Theme pku1743 (后缀数组)

Musical Theme(后缀数组) 题意&#xff1a; n个数&#xff0c;选取一段子序列&#xff0c;满足以下条件&#xff1a; 1.长度至少为5 2.在数列中其他位置出现过(允许转置) 3.与其他位置出现的不重叠 转置&#xff1a;将恒定的正或负值添加到子序列上 例如&#xff1a; n个数为…

各种有用的东西留言板

目录各种链接各种OJ各种有用网站模拟赛排名表格制作其他STLO2优化&#xff1a;快读fread黑科技各种链接 各种OJ ssl 洛谷 纪中 牛客 PTA Vijos JoyOI 51Nod 大视野 ssl比赛 NOI.AC AcWing USACO CodeVS 北京大学 浙江大学 Comet OJ 杭州电子科技大学 《算法竞赛进阶指南》题库…

P3180-[HAOI2016]地图【圆方树,莫队,分块】

正题 题目链接:https://www.luogu.com.cn/problem/P3180 题目大意 nnn个点mmm条边的一个仙人掌&#xff0c;有点权。 QQQ次询问给出op,x,yop,x,yop,x,y&#xff0c;封闭111到xxx号点的所有简单路径后xxx能到达的点的点权中&#xff0c;小于yyy且出现次数为奇数/偶数的权值数目…

M. Monster Hunter(树形dp)

M. Monster Hunter 才知道原来树形dp是三维的&#xff0c;一直没有学会过&#xff0c;感谢大佬的文章&#xff01;算法进阶—理解树形背包问题 状态表示&#xff1a;fi,k,j,{0/1}f_{i,k,j,\{0/1\}}fi,k,j,{0/1}​以iii为根的子树&#xff0c;考虑到第kkk个儿子时&#xff0c;…