codeforces1467E. Distinctive Roots in a Tree
https://codeforces.com/contest/1467/problem/E
这题反过来想以后就很简单了,当时正着想半天都想不出来怎么搞,但是我们反过来标记那些不合法点,只要被标记一次他就是不合法的,那么就很容易了
不合法的时候分两种情况,如果当前点a[u],他的祖先节点中存在a[u],那么找到最近的那个vis[a[u]],那么vis[a[u]]向上,u向下,都是非法点,那么我们利用dfs序对树的这个值进行差分,就可以O(1)标记
第二种情况就是如果它的祖先节点中不存在a[u],但是之前已经存在了过了,那么他们就是通过根节点1,相连的一对点,他们分别的子树都是非法的
这题实现细节还挺多的,wa了好几次。。。还看了wa点的数据才想清楚怎么写
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;const int maxl=4e5+10;int n,m,ind,ans,cnt;ll tot;
int a[maxl],b[maxl];
int lasta[maxl],vis[maxl],nxt[maxl],dfn[maxl],out[maxl];
ll val[maxl];
vector<int> e[maxl];inline void predfs(int u,int fa)
{dfn[u]=++ind;for(int v:e[u])if(v!=fa)predfs(v,u);out[u]=ind;
}inline void prework()
{scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]),b[i]=a[i];sort(b+1,b+1+n);cnt=unique(b+1,b+1+n)-b-1;for(int i=1;i<=n;i++)a[i]=lower_bound(b+1,b+1+cnt,a[i])-b;for(int i=1;i<=n-1;i++){int u,v;scanf("%d%d",&u,&v);e[u].push_back(v);e[v].push_back(u);}predfs(1,0);
}inline void dfs(int u,int fa)
{if(vis[a[u]]){tot++;val[dfn[nxt[a[u]]]]--;val[out[nxt[a[u]]]+1]++;val[dfn[u]]++;val[out[u]+1]--;}else if(lasta[a[u]]>0){val[dfn[lasta[a[u]]]]++;val[out[lasta[a[u]]]+1]--;val[dfn[u]]++;val[out[u]+1]--;}int lastvis=vis[a[u]];vis[a[u]]=u;int lastnxt=nxt[a[u]];for(int v:e[u])if(v!=fa)nxt[a[u]]=v,dfs(v,u);vis[a[u]]=lastvis;nxt[a[u]]=lastnxt;lasta[a[u]]=u;
}inline void mainwork()
{dfs(1,0);for(int i=1;i<=n;i++){val[i]+=val[i-1];if(tot+val[i]==0)ans++;}
}inline void print()
{printf("%d\n",ans);
}int main()
{prework();mainwork();print();return 0;
}
codeforces1467E. Distinctive Roots in a Tree相关推荐
- codeforces1467 E. Distinctive Roots in a Tree(树上差分)
E. Distinctive Roots in a Tree 树上差分 如果当前节点u的某一棵子树中的某个节点的值和当前节点相同,那么除了当前节点这一棵子树节点,其他节点(其他子树以及u上面的节点)一 ...
- Codeforces Round #695(Div. 2)
Codeforces Round #695 (Div. 2) 1467A Wizard of Orz 1467B Hills And Valleys 1467C Three Bags 1467D Su ...
- Paper翻译:《A Novel Convolutional Neural Network Based Model for Recognition and Classification of App》
论文名称:<A Novel Convolutional Neural Network Based Model for Recognition and Classification of Appl ...
- LintCode2016年8月8日算法比赛----子树
子树 题目描述 有两个不同大小的二叉树:T1有上百万的节点:T2有好几百的节点.请设计一种算法,判定T2是否为T1的子树. 注意事项若 T1 中存在从节点 n 开始的子树与 T2 相同,我们称 T2 ...
- 人工智能研究的内容:_更深入:人工智能研究的思想史
人工智能研究的内容: by Elena Nisioti 由Elena Nisioti 更深入:人工智能研究的思想史 (Going deeper: A history of ideas in AI re ...
- Instruments详解
使用Instruments可以监测分析app内存相关的 Overall Memory Use. Leaked Memory. Abandoned Memory. Zombies等内容. 1.Blank ...
- Polygon zkEVM——Hermez 2.0简介
1. 引言 前序博客有: ZK-Rollups工作原理 近期,Polygon团队开源了其Hermez 2.0 zkEVM代码,公开测试网即将上线: https://github.com/0xpolyg ...
- 树形结构数据封装(及拉平)的几种方法
java(for循环处理.递归处理.map处理) public class DemoApplicationTests {/*for循环写法*//*** @param args*/public stat ...
- EasyUI:combotree(树形下拉框)复选框选中父节点(子节点的状态也全部选中)输入框中只显示父节点的文本值
在开发过程中遇到的小案例 效果展示 未处理之前的效果: 处理之后的效果: 需求详情 combotree(树形下拉框)复选框选中父节点时输入框只显示父节点的文本值,但是子节点的状态是选中的. 当所有子节 ...
- 数据结构二叉排序树建立_数据结构101什么是二叉搜索树
数据结构二叉排序树建立 In everyday life, we need to find things or make decisions, and one way to make that pro ...
最新文章
- ZZNU 1993: cots' friends
- Serverless应用场景
- python表头写进csv文件_Python读取CSV文件列并在CSV-fi中写入文件名和列名
- Visio 方向工程连接 Oracle 10G
- 【NUMBER】有关Oracle NUMBER类型定义中precision和scale的测试和总结
- [CODEVS 1036]商务旅行
- 就算给穷人一百万,他们也很难赚到一块钱利润
- 超分辨率技术如何发展?这6篇ECCV 18论文带你一次尽览
- Linux Malloc分析-从用户空间到内核空间【转】
- 软件安装管家matlab教程,timesat软件怎么安装 timesat安装使用图文教程 - 驱动管家...
- 关于word中的DDE如何查看
- 看看人家那公众号管理系统,那叫一个优雅(附源码)
- CNCC 2018参会回顾、总结
- 6月13日云栖精选夜读:数梦工场完成A轮7.5亿融资 三个维度构建“新型互联网”
- c# Process监控进程 与 ManagementEventWatcher 监控进程
- html树状图在线画板,五款在线思维导图工具,总有一款适合你
- C++ windows下判断鼠标点击及获取像素点
- 蜂鸣器、风扇、震动马达
- 豆瓣,清华源下载 pip3
- 自组网(Adhoc)和基础网(Infra)